题目大意:求树的最小路径覆盖数
题解:Tree dp或贪心
Orz题解
我的收获:贪心强啊,dp神啊
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int M=300005;
int T,n;
int t,head[M];
int f[M][2];
struct edge{int to,nex;}e[M*2];
void add(int u,int v){e[t].to=v,e[t].nex=head[u],head[u]=t++;}
void dfs(int x,int fa)
{
int cnt=0;
f[x][0]=f[x][1]=1;
for(int i=head[x];i!=-1;i=e[i].nex){
int v=e[i].to;
if(v==fa) continue;
dfs(v,x);
f[x][0]=min(f[x][0]+f[v][0],f[x][1]+f[v][1]-1);
f[x][1]=min(f[x][1]+f[v][0],cnt+f[v][1]);
cnt+=f[v][0];
}
}
void work()
{
memset(f,0x3f,sizeof(f));
dfs(1,0);
printf("%d\n",min(f[1][0],f[1][1]));
}
void init()
{
scanf("%d",&n);
int x,y;t=0;memset(head,-1,sizeof(head));
for(int i=1;i<n;i++) scanf("%d%d",&x,&y),add(x,y),add(y,x);
}
int main()
{
scanf("%d",&T);
while(T--) init(),work();
return 0;
}