hdu 并查集专题

http://acm.hdu.edu.cn/diy/contest_show.php?cid=16562

1.How Many Tables

View Code
 1 #include<stdio.h>
 2 int root[1001];
 3 int find(int x)
 4 {
 5     int r=x;
 6     while(r!=root[r])
 7     r=root[r];
 8     int i=x,j;
 9     /*
10     while(i!=r)
11     {
12         j=root[i];
13         root[i]=r;
14         i=j;
15     }
16     */
17     return r;
18     
19 }
20 
21 void merge(int x,int y)
22 {
23     
24     int fx,fy;
25     fx=find(x);
26     fy=find(y);
27     if(fx!=fy) root[fx]=fy; 
28 }
29 int main()
30 {
31     int t;
32     int n,m;
33     int i,j;
34     int a,b;
35     scanf("%d",&t);
36     while(t--)
37     {
38         scanf("%d%d",&n,&m);
39         for(i=1;i<=n;i++)
40         root[i]=i;
41         for(i=0;i<m;i++)
42         {
43             scanf("%d%d",&a,&b);
44             merge(a,b);
45         }
46         int count=0;
47         for(i=1;i<=n;i++)
48         {
49             if(find(i)==i)
50             {
51                 count++;
52                 
53             }
54         }
55         printf("%d\n",count);
56     }
57 }

 2.小希的迷宫

View Code
 1 #include<stdio.h>
 2 int root[100010];
 3 int vis[100010];
 4 int find(int x)
 5 {
 6     while(x!=root[x])
 7     x=root[x];
 8     return x;
 9 }
10 void merge(int x,int y)
11 {
12     
13     int fx,fy;
14     fx=find(x);
15     fy=find(y);
16     if(fx!=fy) root[fx]=fy;
17 }
18 void init()
19 {
20     for(int i=1;i<=100000;i++)
21     {
22         root[i]=i;
23         vis[i]=0;
24     }
25 }
26 int main()
27 {
28     int flag=0;
29     int a,b;
30     
31     while(~scanf("%d%d",&a,&b))
32     {
33         int jie=0;
34         init();
35         if(a==-1&&b==-1) break;
36         if(a==0&&b==0) 
37         {
38             printf("Yes\n");
39             continue;
40         }
41         if(vis[a]==0)
42         {
43             jie++;
44             vis[a]=1;
45         }
46         if(vis[b]==0)
47         {
48             jie++;
49             vis[b]=1;
50         }
51         merge(a,b);
52         jie--;
53         while(~scanf("%d%d",&a,&b))
54         {
55             if(a==0&&b==0) break;
56             if(find(a)==find(b))
57             {
58                 flag=1;
59                 //break;
60             }
61             else 
62             {
63                 if(vis[a]==0)
64                 {
65                     vis[a]=1;
66                     jie++;
67                 }
68                 if(vis[b]==0)
69                 {
70                     vis[b]=1;
71                     jie++;
72                 }
73                 merge(a,b);
74                 jie--;
75             }
76         }
77         
78         if(flag==0&&jie==1) printf("Yes\n"); 
79         else printf("No\n");
80         
81     }
82 }

前面那写错了,flag应该在里面,竟然过了,数据弱爆了。 

3.Is It A Tree?

 不能有两个父节点

View Code
 1 /*
 2 看了别人写的,交了好多次
 3 1.a,b为负数退出,而不是-1,-1
 4 2.a,b有一个0是树 
 5 */ 
 6 
 7 #include<stdio.h>
 8 #include<string.h>
 9 int root[100010];
10 int vis[100010];
11 int main()
12 {
13     
14     int a,b;
15     int k=1;
16     int flag;
17     int jie,jie2;
18     while(~scanf("%d%d",&a,&b))
19     {
20         memset(root,0,sizeof(root));
21         memset(vis,0,sizeof(vis));
22         flag=0;
23         jie=0;
24         jie2=0;
25         if(a<0&&b<0) break;
26         if(a==0||b==0) 
27         {
28             printf("Case %d is a tree.\n",k);
29             k++;
30             continue;
31         }
32         if(vis[a]==0)
33         {
34             jie++;
35             vis[a]=1;
36         }
37         if(vis[b]==0)
38         {
39             jie++;
40             vis[b]=1;
41         }
42         if(root[b]==0)
43         {
44             root[b]==1;
45             jie2++;
46         }
47         else
48         flag=1;
49         while(~scanf("%d%d",&a,&b))
50         {
51             
52             if(a==0&&b==0) break;
53             if(root[b]==0)
54             {
55                 root[b]=1;
56                 jie2++;
57             }
58             else flag=1;
59                 if(vis[a]==0)
60                 {
61                     vis[a]=1;
62                     jie++;
63                 }
64                 if(vis[b]==0)
65                 {
66                     vis[b]=1;
67                     jie++;
68                 }
69             }
70         if(!jie&&!jie2) printf("Case %d is a tree.\n",k); 
71         if(flag||jie-jie2!=1) printf("Case %d is not a tree.\n",k); 
72         else printf("Case %d is a tree.\n",k);
73         k++;
74         
75     }
76 }

 4.More is better

 

View Code
 1 #include<stdio.h>
 2 #define Max(x,y) x>y?x:y
 3 int root[10000010];
 4 int vis[10000010];
 5 int find(int x)
 6 {
 7     int r=x;
 8     while(r!=root[r])
 9     r=root[r];
10     int i=x,j;
11     while(i!=r)
12     {
13         j=root[i];
14         root[i]=r;
15         i=j;
16     }
17     return r;
18 } 
19 void init()
20 {
21     int i;
22     for(i=1;i<=10000000;i++)
23     {
24         root[i]=i;
25     vis[i]=1;
26     }
27 }
28 
29 void merge(int x,int y)
30 {
31     int fx,fy;
32     fx=find(x);
33     fy=find(y);
34     if(fx>fy) 
35     {
36         root[fx]=fy;
37         vis[fy]+=vis[fx];
38     }
39     else if(fy>fx)//注意 else if(fy>fx)而不是else ,输入同一个数是同一个人 
40     {
41         root[fy]=fx;
42         vis[fx]+=vis[fy];
43     }
44 }
45 
46 int main()
47 {
48     int n;
49     int i;
50     int a,b;
51     while(~scanf("%d",&n))
52     {
53         init();
54         for(i=1;i<=n;i++)
55         {
56             scanf("%d%d",&a,&b);
57             merge(a,b);
58         }
59         int max=vis[1];
60         for(i=1;i<=10000000;i++)//不要求点的个数,因为没说按顺序 
61         {
62             max=Max(max,vis[i]);
63         }
64         printf("%d\n",max);
65     }
66     
67 }

 

 

 

 

6.畅通工程

View Code
 1  #include<stdio.h>
 2  #include<string.h>
 3  #include<stdlib.h>
 4  int  root[105];
 5  struct Node
 6  {
 7      int u;
 8      int v;
 9      int len;
10  }node[105];
11  int cmp(const void *a,const void *b)
12  {
13      return (*(Node*)a).len>(*(Node*)b).len?1:-1;//结构体按len从小到大排序 
14  }
15  int find(int x)
16  {
17      int r=x;
18      while(r!=root[r])
19      {
20          r=root[r];
21      }
22      
23      int i=x;
24      int j;
25      while(i!=r)
26      {
27          j=root[i];
28          root[i]=r;
29          i=j;
30     }
31     
32      return r;
33 }
34  
35  void merge(int x,int y)
36  {
37      
38      
39      int fx,fy;
40      fx=find(x);
41      fy=find(y);
42      if(fx!=fy) root[fx]=fy;
43  }
44  
45  
46  
47  int main()
48  {
49      int n,m;
50      int i,j,k;
51      
52      while(~scanf("%d%d",&n,&m),n)
53      {
54          for(i=1;i<=m;i++)
55          root[i]=i;
56          int sum=0;
57          for(i=0;i<n;i++)
58          {
59              scanf("%d%d%d",&node[i].u,&node[i].v,&node[i].len);
60              
61          }
62          
63          qsort(node,n,sizeof(node[0]),cmp);
64          
65          for(i=0;i<n;i++)
66          {
67              if(find(node[i].u)!=find(node[i].v))
68              {
69                  merge(node[i].u,node[i].v);
70              sum+=node[i].len;
71              }
72          }
73          int count=0;
74          for(i=1;i<=m;i++)
75          root[i]=find(i);
76          for(i=1;i<=m;i++)
77          {
78              if(root[i]==i)
79              count++;
80          }
81          if(count>1) printf("?\n");
82          else printf("%d\n",sum);
83      }
84      
85      
86  }

7.继续畅通工程

View Code
 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 int root[105];
 4 struct Node
 5 {
 6     int start;
 7     int end;
 8     int  len;
 9     int state;
10 }node[5000];
11 int cmp(const void *a,const void *b)
12 {
13     return (*(Node*)a).len>(*(Node*)b).len?1:-1;
14 }
15 int find(int x)
16 {
17     int r=x;
18     while(r!=root[r])
19     r=root[r];
20     return r;
21 }
22 void merge(int x,int y)
23 {
24     
25     int fx,fy;
26     fx=find(x);
27     fy=find(y);
28     if(fx!=fy) root[fx]=fy;
29 }
30 int main()
31 {
32     int n;
33     int m;
34     int i,j,k;
35     while(~scanf("%d",&n),n)
36     {
37         for(i=1;i<=n;i++)
38         root[i]=i;
39         m=n*(n-1)/2;
40         int sum=0;
41         for(i=0;i<m;i++)
42         {
43             scanf("%d%d%d%d",&node[i].start,&node[i].end,&node[i].len,&node[i].state);
44             if(node[i].state==1) 
45             {
46             merge(node[i].start,node[i].end);//这句话可以用node[i].len=0;换 
47             
48             }
49             
50         }
51         qsort(node,m,sizeof(node[1]),cmp);
52 
53         for(i=0;i<m;i++)
54         {
55             if(find(node[i].start)!=find(node[i].end))
56             {
57                 merge(node[i].start,node[i].end);
58                 sum+=node[i].len;
59             }
60         }
61         
62         printf("%d\n",sum);
63     }
64 }

11.A Bug's life

View Code
 1 #include<stdio.h>
 2 int root[2005];
 3 int vis[2005];
 4 int find(int x)
 5 {
 6     int r=x;
 7     while(r!=root[r])
 8     r=root[r];
 9     return r;
10 }
11 void merge(int x,int y)
12 {
13     
14     int fx,fy;
15     fx=find(x);
16     fy=find(y);
17     if(fx!=fy) root[fx]=fy;
18     
19 }
20 
21 int main() 
22 {
23     int n,m;
24     int t,i;
25     int a,b;
26     int count=0;
27     int flag;
28     scanf("%d",&t);
29     while(t--)
30     {
31         flag=0;
32         scanf("%d%d",&n,&m);
33         for(i=1;i<=n;i++)
34         {
35             root[i]=i;
36             vis[i]=0;
37         }
38         count++;
39         
40             for(i=1;i<=m;i++)
41             {
42                 scanf("%d%d",&a,&b);
43                 if(vis[a]==0) 
44                 {
45                     vis[a]=b;
46                 }
47                 else
48                 {
49                     merge(vis[a],b);
50                 }
51                 if(vis[b]==0) 
52                 {
53                     vis[b]=a;
54                 }
55                 else
56                 {
57                     merge(vis[b],a);
58                 }
59                 if(find(a)==find(b)) 
60                 {
61                     flag=1;
62                 }
63             
64           }
65           printf("Scenario #%d:\n",count);
66           if(flag)  printf("Suspicious bugs found!\n");
67           else printf("No suspicious bugs found!\n");
68           printf("\n");
69     }
70 }

 

 

 

posted on 2012-08-11 16:47  仁者无敌8勇者无惧  阅读(228)  评论(0编辑  收藏  举报

导航