hdu1856(并查集)

 1 #include <stdio.h>
 2 #include <algorithm>
 3 using namespace std;
 4 int set[10000005];
 5 int num[10000005];
 6 
 7 int cmp(int a,int b)
 8 {
 9     return a>b;
10 }
11 
12 void makeset()
13  {
14      for(int i=1;i<10000005;i++)
15      {
16          set[i]=i;
17          num[i]=1;
18      }
19  }
20 
21 
22  int findset(int x)//
23  {
24      if(x!=set[x])
25      {
26          set[x]=findset(set[x]);//之所以不可以直接返回是因为这里可能有多层的关系
27      }
28      return set[x];
29  }
30  void Union(int a,int b)//
31  {
32      int x=findset(a);
33      int y=findset(b);
34      if(x==y)
35      {
36          return ;
37      }
38      if(num[x]>=num[y])
39      {
40          num[x]+=num[y];
41          set[y]=set[x];
42      }
43      else
44      {
45          num[y]+=num[x];
46          set[x]=set[y];
47      }
48  }
49 int main()
50 {
51     int n;
52     int first;
53     int second;
54     while(scanf("%d",&n)!=EOF)
55     {
56         makeset();
57         for(int i=0;i<n;i++)
58         {
59             scanf("%d %d",&first,&second);
60             Union(first,second);
61         }
62         int max=-100000;
63         for(int i=0;i<10000005;i++)
64         {
65             if(num[i]>max) max=num[i];
66         }
67         printf("%d\n",max);
68     }
69     return 0;
70 }

好像不难啊,都是模板啊

posted on 2012-08-12 16:15  矮人狙击手!  阅读(171)  评论(0编辑  收藏  举报

导航