用并查集求解连通分量问题
2011-03-03 09:46
344 查看
在求解连通分量问题时,之前是用 搜索的思想,就是如果 用几次搜索能遍历整个图,那么连通分量就是n次-1,不过这种有一个问题就是空间消耗太大,我们必须为程序开一个a[n-1][n-1]的存储空间,当图中的结点个数太多时,我们将发现这种算法将是不可取的。。
于是今天学习了一个新的数据结构就是并查集。。。他的思想是初始化时每个元素都是一个集合。。。之后把具有亲戚关系的元素合并,这样最后还能当得上所谓祖先的元素的元素个数就是有几个家族了,连通分量也就是家族个数减去1了。。这个方法简单而且容易理解是一个不错算法思想,以后要多多学习,今天毕竟才第一次接触、、、下面是用并查集写的求连通分量算法。。
#include<stdio.h>
int set[1003];
int find(int x)
{
int r=x;
while(r!=set[r])
{
r=set[r];
}
return r;
}
void merge(int a,int b)
{
int fx=find(a); //保证每次相连的都是根!!!
int fy=find(b);
if(fx!=fy) set[fx]=fy;
}
int main()
{
int n,m;
while(1)
{
scanf("%d",&n);
if(n==0) break;
scanf("%d",&m);
int i;
for(i=1;i<=n;i++)
set[i]=i;
while(m--)
{
int a,b;
scanf("%d%d",&a,&b);
merge(a,b);
}
int count=-1;//n个集合就有n-1条路;
for(i=1;i<=n;i++)
if(i==set[i])
count++;
printf("%d/n",count);
}
return 0;
}
于是今天学习了一个新的数据结构就是并查集。。。他的思想是初始化时每个元素都是一个集合。。。之后把具有亲戚关系的元素合并,这样最后还能当得上所谓祖先的元素的元素个数就是有几个家族了,连通分量也就是家族个数减去1了。。这个方法简单而且容易理解是一个不错算法思想,以后要多多学习,今天毕竟才第一次接触、、、下面是用并查集写的求连通分量算法。。
#include<stdio.h>
int set[1003];
int find(int x)
{
int r=x;
while(r!=set[r])
{
r=set[r];
}
return r;
}
void merge(int a,int b)
{
int fx=find(a); //保证每次相连的都是根!!!
int fy=find(b);
if(fx!=fy) set[fx]=fy;
}
int main()
{
int n,m;
while(1)
{
scanf("%d",&n);
if(n==0) break;
scanf("%d",&m);
int i;
for(i=1;i<=n;i++)
set[i]=i;
while(m--)
{
int a,b;
scanf("%d%d",&a,&b);
merge(a,b);
}
int count=-1;//n个集合就有n-1条路;
for(i=1;i<=n;i++)
if(i==set[i])
count++;
printf("%d/n",count);
}
return 0;
}
相关文章推荐
- 求解有向图的强连通分量的SCC问题---POJ 2186 Popular Cows
- 并查集--求解等价问题
- 图的连通性问题之强连通分量初步
- 最小生成树MST的Kruskal算法+并查集(链表实现)划分连通分量和集合,并查集可以保存多个集合
- Tarjan算法求解无向连通图的割点、割边、点双连通分量和边双连通分量的模板
- 图的连通性问题&tarjan求强连通分量、割点、桥
- 重连通分量的求解
- POJ 2186-Popular Cows:强连通分量问题
- ccf之高速公路 求强连通分量问题
- NYOJ 247 虚拟的城市之旅(SPFA算法求解有向图连通分量中两点最大差值)
- 连通分量的个数-->并查集的使用
- POJ 2186-Popular Cows:强连通分量问题
- hdu 1232 并查集 求连通分量的个数
- 并查集求解问题
- POJ 3207 Ikki's Story IV - Panda's Trick 强连通分量或并查集+2sat
- 小希的迷宫 并查集判断无向环及连通问题 树的性质
- LA3644(并查集,维护连通分量的集合)
- 连通图关节点求解详解--tarjan算法,重连通分量的求解--栈
- sdut 1488 数据结构实验:连通分量个数(并查集)
- [HDU1232] 畅通工程 (并查集 or 连通分量)