HDU 1856

http://acm.split.hdu.edu.cn/showproblem.php?pid=1856

对于这道题,主要就是让你求出有最多结点的树的树叶;

我们只要利用并查集的知识吧所输入的数据连接成树,然后逐一找出树叶最多的树就可以。利用一个num数组,在最开始的时候每个节点自己是一颗树,num[i]=1;在之后把在同一个父亲结点的num[i]连接起来。

再逐一查找出最大的就可以啦。

思路就是这样啊,可是我的提交上就是wa,心灰意冷啊,啊,啊啊,啊啊啊。我把我的代码贴上面,希望大神们看见帮我改一改。

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<iostream>
 4 #include<algorithm>
 5 using namespace std;
 6 const int M=10000000;
 7 int fa[M],num[M];
 8 void init(){
 9 for(int i=1;i<=M;i++){
10     fa[i]=i;
11     num[i]=1;
12 }
13 }
14 int fin(int x){
15 return fa[x]=x?fa[x]:fa[x]=fin(fa[x]);
16 }
17 void unin(int x,int y){
18 int p=fin(x);
19 int q=fin(y);
20 if(p!=q){
21     fa[p]=q;
22     num[q]+=num[p];
23 }
24 }
25 int main()
26 {
27     int n,a,b;
28     while(~scanf("%d",&n)){
29         if(n==0){
30                 printf("1
");
31         continue;
32         }
33         int ans=0;
34         init();
35         for(int i=0;i<n;i++){
36             scanf("%d%d",&a,&b);
37             if(a>ans)ans=a;
38             if(b>ans)ans=b;
39             unin(a,b);
40 
41         }
42         int maxn=0;
43         for(int i=1;i<=ans;i++){
44             if(num[i]>maxn)
45                 maxn=num[i];
46         }
47         cout<<maxn<<endl;
48     }
49     return 0;
50 }
View Code

 下面的这个是我在网上查找的大神的代码,我俩除啦参数之外是一样一样的啊,我的咋就不过呢。。。。。

 1 #include<stdio.h>
 2 #define N 10000000
 3 int father[N],num[N];
 4 void initial()/*初始化*/
 5 {
 6     int i;
 7     for(i=1;i<=N;i++)
 8     {
 9         father[i]=i;
10         num[i]=1;/*开始时数量都为1,根节点为自己*/
11     }
12 }
13 int find(int x) /*寻找根节点*/
14 {
15     if(father[x]!=x)
16         father[x]=find(father[x]);
17     return father[x];
18 }
19 void merge(int a,int b)/*合并a和b*/
20 {
21     int p=find(a);
22     int q=find(b);
23     if(p!=q)
24     {
25         father[p]=q;
26         num[q]+=num[p];/*合并集合中元素个数*/
27     }
28 }
29 int main()
30 {
31     int n,a,b,i,sum,max;
32     while(~scanf("%d",&n))
33     {
34         if(n==0)
35         {
36             printf("1
");
37             continue;
38         }
39         max=0;
40         initial(); /*初始化*/
41         for(i=0;i<n;i++)
42         {
43             scanf("%d%d",&a,&b);
44             if(a>max)
45                 max=a;
46             if(b>max)
47                 max=b;
48             merge(a,b); /*合并集合*/
49         }
50         int Max=0;
51         for(i=1;i<=max;i++)
52             if(num[i]>Max) /*查找最大值*/
53                 Max=num[i];
54         printf("%d
",Max);
55     }
56     return 0;
57 }
View Code
你若盛开,清风自来...
原文地址:https://www.cnblogs.com/shangjindexiaoqingnian/p/5830896.html