并查集

Posted shuoed

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并查集相关的知识,希望对你有一定的参考价值。

1. HDU 1232(并查集模板题)

技术分享
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<string.h>
 4 using namespace std;
 5 #define MAX 1002
 6 int pre[MAX];///用来标记关系
 7 int t[MAX];///用来标记独立的快
 8 int find(int x)///查找根节点                                                                                              //查找根节点
 9 {
10     int r=x;
11     while(pre[r]!=r)                                                                                              //返回根节点 r
12         r=pre[r];
13     int i=x,j;
14     while(i!=r)                                                                                                        //路径压缩
15     {
16         j=pre[i]; // 在改变上级之前用临时变量  j 记录下他的值
17         pre[i]=r ; //把上级改为根节点
18         i=j;
19     }
20     return r;
21 }
22 
23 void join(int x,int y)//判断x y是否连通,
24 //如果已经连通,就不用管了 //如果不连通,就把它们所在的连通分支合并起,
25 {
26     int fx=find(x),fy=find(y);
27     if(fx!=fy)
28         pre[fx]=fy;
29 }
30 int main()
31 {
32     int n,m,from,to,ans,i;
33     while(scanf("%d%d",&n,&m)!=EOF&&n)
34     {
35         for(int i=1; i<=n; i++)//初始化
36             pre[i]=i;
37         for(int i=1; i<=m; i++)
38         {
39             scanf("%d%d",&from,&to);
40             join(from,to);
41         }
42         memset(t,0,sizeof(t));
43         for(int i=1; i<=n; i++)
44             t[find(i)]=1;///标记根节点
45         for(ans=0,i=1; i<=n; i++)
46             if(t[i])
47                 ans++;
48         printf("%d\n",ans-1);
49     }
50     return 0;
51 }
View Code

 

以上是关于并查集的主要内容,如果未能解决你的问题,请参考以下文章

想要学会并查集吗?看我四十行代码实现它

树--12---并查集

笔记并查集---无向图处理代码模板及类型题

并查集

力扣 每日一题 886. 可能的二分法难度:中等,rating: 1794(并查集 / 拆点优化的扩展域并查集)

并查集