【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;
}
View Code

 

posted @ 2017-08-31 12:36  ONION_CYC  阅读(141)  评论(0编辑  收藏  举报