热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

hdu并查集专题

http:acm.hdu.edu.cndiycontest_show.php?cid165621.HowManyTablesViewCode1#

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

1.How Many Tables

View Code
 1 #include
 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)
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
 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
 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
 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
 2  #include<string.h>
 3  #include
 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)
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)
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
 2 #include
 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)
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)
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
 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 }

 

 

 


推荐阅读
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • c语言\n不换行,c语言printf不换行
    本文目录一览:1、C语言不换行输入2、c语言的 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
author-avatar
Seet琸琸
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有