标签:
7 2 1 2 1 3 2 4 2 5 3 6 3 7
2
大意:
给你n-1个关系,a直接领导b。问这些人中有多少人可以领导K个人。领导包括直接领导和间接领导。
思路:
用数组num[]记录每个结点领导的人数,令i从1~n表示结点,若i不是父结点,让num[fa[i]]+1,表示i上面的结点领导的人数加1,一直加到父结点,到i=n时sun[1~n]表示1~n个结点领导的人数,再找出人数等于k的。
1 #include<cstdio> 2 #include<string.h> 3 #include<algorithm> 4 using namespace std; 5 int n,k,i,ans,fa[110],a,b,num[110]; 6 void f1(int a) //若a不是父结点,让a上面所有结点都加1;表示领导的人数 7 { 8 while(a != fa[a]) 9 { 10 num[fa[a]]++; 11 a=fa[a]; 12 } 13 } 14 int main() 15 { 16 while(scanf("%d %d",&n,&k)!=EOF) 17 { 18 memset(num,0,sizeof(num)); 19 ans=0; 20 for(i = 1 ; i <= n ; i++) 21 { 22 fa[i]=i; 23 } 24 for(i = 1 ; i < n ; i++) 25 { 26 scanf("%d %d",&a,&b); 27 fa[b]=a; 28 } 29 for(i = 1 ; i <= n ; i++) 30 { 31 f1(i); 32 } 33 for(i = 1; i<=n;i++) 34 { 35 if(num[i] == k) //找出领导的人数为k的结点 36 { 37 ans++; 38 } 39 } 40 printf("%d\n",ans); 41 } 42 }
标签:
原文地址:http://www.cnblogs.com/yexiaozi/p/5727272.html