您的位置:首页 > 其它

[树形DP || 贪心] BZOJ 1907 树的路径覆盖

2016-08-23 18:26 363 查看
DP

#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#define cl(x) memset(x,0,sizeof(x))
using namespace std;

inline char nc()
{
static char buf[100000],*p1=buf,*p2=buf;
if (p1==p2) { p2=(p1=buf)+fread(buf,1,100000,stdin); if (p1==p2) return EOF; }
return *p1++;
}

inline void read(int &x){
char c=nc(),b=1;
for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1;
for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b;
}

const int N=100005;

struct edge{
int u,v,next;
}G[N<<1];
int head
,inum;

inline void add(int u,int v,int p){
G[p].u=u; G[p].v=v; G[p].next=head[u]; head[u]=p;
}
int n;
int f
[2];
int pnt=0,a
,val
,ch
;
#define V G[p].v
inline void dfs(int u,int fa){
f[u][1]=1<<30;
int sum=0,mini=1<<30,flag=0;
for (int p=head[u];p;p=G[p].next)
if (V!=fa)
dfs(V,u);
pnt=0;
for (int p=head[u];p;p=G[p].next)
if (V!=fa){
ch[++pnt]=V;
a[pnt]=min(f[V][0],f[V][1]);
if (f[V][0]<=f[V][1])
sum+=f[V][0],flag=1;
else
sum+=f[V][1],mini=min(mini,f[V][0]-f[V][1]);
flag?val[pnt]=sum:val[pnt]=sum+mini;
}
if (pnt) for (int i=pnt-1;i;i--) a[i]+=a[i+1]; a[pnt+1]=0;
for (int i=2;i<=pnt;i++)
f[u][1]=min(f[u][1],val[i-1]+a[i+1]+f[ch[i]][0]-1);
if (!pnt)
f[u][0]=1;
else
f[u][0]=min(a[1]+1,val[pnt]);
}

int main()
{
int T,iu,iv;
freopen("t.in","r",stdin);
freopen("t.out","w",stdout);
read(T);
while (T--){
read(n);
for (int i=1;i<n;i++)
read(iu),read(iv),add(iu,iv,++inum),add(iv,iu,++inum);
dfs(1,0);
printf("%d\n",min(f[1][0],f[1][1]));
cl(head); inum=0; cl(f);
}
return 0;
}

贪心

#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#define cl(x) memset(x,0,sizeof(x))
using namespace std;

inline char nc()
{
static char buf[100000],*p1=buf,*p2=buf;
if (p1==p2) { p2=(p1=buf)+fread(buf,1,100000,stdin); if (p1==p2) return EOF; }
return *p1++;
}

inline void read(int &x){
char c=nc(),b=1;
for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1;
for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b;
}

const int N=100005;

struct edge{
int u,v,next;
}G[N<<1];
int head
,inum;

inline void add(int u,int v,int p){
G[p].u=u; G[p].v=v; G[p].next=head[u]; head[u]=p;
}
int n;
int f
,vst
;
#define V G[p].v
inline void dfs(int u,int fa){
f[u]=1; int sum=0;
for (int p=head[u];p;p=G[p].next)
if (V!=fa)
dfs(V,u),f[u]+=f[V],sum+=(!vst[V]);
if (sum>=2)
f[u]-=2,vst[u]=1;
else
f[u]-=(sum==1);
}

int main()
{
int T,iu,iv;
freopen("t.in","r",stdin);
freopen("t.out","w",stdout);
read(T);
while (T--){
read(n);
for (int i=1;i<n;i++)
read(iu),read(iv),add(iu,iv,++inum),add(iv,iu,++inum);
dfs(1,0);
printf("%d\n",f[1]);
cl(head); inum=0; cl(vst); cl(f);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: