码迷,mamicode.com
首页 > 其他好文 > 详细

杭电 5326 Work (并查集求子结点为k的结点数)

时间:2016-08-01 22:40:27      阅读:233      评论:0      收藏:0      [点我收藏+]

标签:

Description

技术分享


It’s an interesting experience to move from ICPC to work, end my college life and start a brand new journey in company. 
As is known to all, every stuff in a company has a title, everyone except the boss has a direct leader, and all the relationship forms a tree. If A’s title is higher than B(A is the direct or indirect leader of B), we call it A manages B. 
Now, give you the relation of a company, can you calculate how many people manage k people. 

Input

There are multiple test cases. 
Each test case begins with two integers n and k, n indicates the number of stuff of the company. 
Each of the following n-1 lines has two integers A and B, means A is the direct leader of B. 

1 <= n <= 100 , 0 <= k < n 
1 <= A, B <= n 

Output

For each test case, output the answer as described above.

Sample Input

7 2
1 2
1 3
2 4
2 5
3 6
3 7

Sample Output

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 }

 

杭电 5326 Work (并查集求子结点为k的结点数)

标签:

原文地址:http://www.cnblogs.com/yexiaozi/p/5727272.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!