【BZOJ】1596: [Usaco2008 Jan]电话网络
【算法】树上贪心
【题解】
因为一个点必须被覆盖,那么它如果没有被子树节点覆盖的话,就覆盖它的父节点。
从叶子开始贪心。
注意,如果它自己已经被选了就不需要选父节点了。
#include<cstdio> #include<algorithm> #include<cstring> #include<cctype> using namespace std; const int maxn=10010; struct edge{int v,from;}e[maxn*3]; int first[maxn],n,tot,ans,g[maxn]; int read() { char c;int s=0,t=1; while(!isdigit(c=getchar()))if(c=='-')t=-1; do{s=s*10+c-'0';}while(isdigit(c=getchar())); return s*t; } void insert(int u,int v) {tot++;e[tot].v=v;e[tot].from=first[u];first[u]=tot;} void dfs(int x,int fa){ bool ok=0; for(int i=first[x];i;i=e[i].from)if(e[i].v!=fa){ dfs(e[i].v,x); if(g[e[i].v])ok=1; } if(!ok&&!g[x]&&!g[fa])g[fa]=1,ans++; } int main(){ n=read(); int u,v; for(int i=1;i<n;i++){ u=read();v=read(); insert(u,v);insert(v,u); } ans=0; dfs(1,1); printf("%d",ans); return 0; }