HDOJ1856More is better

来源:互联网 发布:mac下jenkins安装 编辑:程序博客网 时间:2024/06/05 10:42

题目:

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

 

代码及解析:

 

#include<stdio.h>#define MAX 10000001int per[MAX];int num[MAX];/*int find(int x){int r,j;r = per[x];while( r != per[r])r = per[x];while(per[x] != r){j = per[x];per[x] = r;x = r;}return r;}*///使用递归回溯比用while循环要快很多(不知道为什么)//查找点x的根结点int find(int x){if(per[x] != x)return find(per[x]);return x;}int main(){int n,A,B,b,i;while(scanf("%d",&n) != EOF){if(n == 0)//当n为0的时候应该为1{printf("1\n");continue;}for(i = 0; i <= MAX; i++)//进行初始化{per[i] = i;num[i] = 1;}b = 0;//b初始化为0,用来保存最大节点个数。while(n --){scanf("%d%d",&A,&B);//查找A和B所在树的根结点A = find(A);B = find(B);if(A != B)//不在同一棵树{if(num[A] < num[B])//当A的节点数比B的少则将A树接到B树上{per[A] = B;num[B] += num[A];if(num[B] > b)b = num[B];}else//当B树的节点个数比A少或者相同的时候,在将B树接到A树的根节点{per[B] = A;num[A] += num[B];if(num[A] > b)b = num[A];}}}printf("%d\n",b);//输出最大值}return 0;}


原创粉丝点击