hdu 1213 并查集
2013-03-16 15:27
309 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1213
/*
并查集就是查找两个元素的根结点,并按规定通过这两个元素把两元素所在的集合合并。属于同一集合的元素通过查找函数得到的根结点是相同的,由此可判断两个元素是否同属一个集合。
确定根节点数:最后结果中,满足 Father[i]=i 的节点 i 为根节点;
判断是否有环:在 Union() 函数中,如果 x==y 则表示形成了一个环;
*/
/*
并查集就是查找两个元素的根结点,并按规定通过这两个元素把两元素所在的集合合并。属于同一集合的元素通过查找函数得到的根结点是相同的,由此可判断两个元素是否同属一个集合。
确定根节点数:最后结果中,满足 Father[i]=i 的节点 i 为根节点;
判断是否有环:在 Union() 函数中,如果 x==y 则表示形成了一个环;
*/
#include<stdio.h> #define Max 1000 int Father[Max+5],sum; void Makeset(int n)//初始化记录父结点的数组 { int i; for(i=1;i<=n;i++) Father[i]=i; } int Findset(int x)//查找元素的根结点 { if(x!=Father[x]) Father[x]=Findset(Father[x]);//通过递归实现在查找过程中压缩路径 return Father[x]; } void Union(int a,int b)//将两个元素所属的集合合并 { int x=Findset(a); int y=Findset(b); if(x==y) return; sum--; Father[y]=x; } int main() { int T,n,m,a,b; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); Makeset(n); sum=n; while(m--) { scanf("%d%d",&a,&b); Union(a,b); } printf("%d\n",sum); getchar(); } return 0; }
相关文章推荐
- HDU - 1213 How Many Tables(并查集)
- hdu 1213 并查集用Kruskal算法
- HDU 1213 How Many Tables 第一道并查集的题。
- hdu 1213并查集
- HDU 1213 How Many Tables (并查集,常规)
- HDU1213 How Many Tables(简单的并查集)
- HDU 1213 How Many Tables(并查集)
- HDU-1213-How Many Tables(并查集)
- HDU--1213并查集
- hdu 1213 How Many Tables 并查集
- HDU 1213 How Many Tables? (简单并查集)
- HDU 1213 How Many Tables(并查集模板)
- HDU1213-How Many Tables 并查集
- hdu 1213 How Many Tables(并查集练习)
- HDU 1213 How Many Tables [并查集]
- HDU 1213 How Many Tables(并查集)
- HDU - 1213 How Many Tables解题报告(并查集)
- hdu 1213 (并查集)
- hdu1213 并查集
- hdu 1213 并查集入门