对于这道题,主要就是让你求出有最多结点的树的树叶;
我们只要利用并查集的知识吧所输入的数据连接成树,然后逐一找出树叶最多的树就可以。利用一个num数组,在最开始的时候每个节点自己是一颗树,num[i]=1;在之后把在同一个父亲结点的num[i]连接起来。
再逐一查找出最大的就可以啦。
思路就是这样啊,可是我的提交上就是wa,心灰意冷啊,啊,啊啊,啊啊啊。我把我的代码贴上面,希望大神们看见帮我改一改。
1 #include2 #include 3 #include 4 #include 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\n");31 continue;32 }33 int ans=0;34 init();35 for(int i=0;i 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< <
下面的这个是我在网上查找的大神的代码,我俩除啦参数之外是一样一样的啊,我的咋就不过呢。。。。。
1 #include2 #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\n");37 continue;38 }39 max=0;40 initial(); /*初始化*/41 for(i=0;i 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\n",Max);55 }56 return 0;57 }