CodeForces 580C

来源:互联网 发布:万网域名增加二级 编辑:程序博客网 时间:2024/06/05 08:57

这个就是遍历一个树,让你找从头结点到未结点,含标记连续不超多k有多少个。。。
这个题,经典在于一开始我并不知道怎么解决是否为叶子节点的问题,这个题吧,就解决了。。。。

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int MaxN = 1e5;int n , m , ans , a[MaxN + 5];int all , last[MaxN + 5] , pre[2 * MaxN + 5] , other[2*MaxN + 5];void Build(int x , int y){    pre[++all] = last[x];    last[x] = all;    other[all] = y;}void dfs(int x , int fa , int cnt){    if(cnt > m) return;//超过数量就返回    int num = 0;    int ed = last[x];    while(ed != -1){        int dr = other[ed];        if(dr != fa){            if(a[dr] == 0) dfs(dr , x , 0);            else dfs(dr , x , cnt + 1);            num++;//找儿子有几个        }        ed = pre[ed];    }    if(num == 0) ans++;//如果没有儿子的话,那么就是叶子节点}int main(){    all = -1 ;    memset(last , -1 , sizeof(last));    scanf("%d%d", &n , &m);    for(int i = 1 ; i <= n ; i++) scanf("%d",&a[i]);    for(int i = 1 ; i <= n - 1 ; i++){        int u , v;        scanf("%d%d", &u , &v);        Build(u,v);        Build(v,u);    }    int cnt ;    ans = 0;    if(a[1] == 0) cnt = 0;    else cnt = 1;    dfs(1 , 0 , cnt);    printf("%d\n",ans);}
0 0
原创粉丝点击