HDU 1213 How Many Tables 并查集
2013-07-30 20:20
337 查看
题目描述:Ignatius,这个人过生日,然后请了很多朋友来聚会,然后并不是他的所有的朋友都互相认识,现在给出他的朋友们相互认识的情况,并且规定,如果1认识2,2认识3,则1认识3,要求每一伙认识的朋友坐在一张桌子上,然后要求一共需要多少张桌子。
解题报告:此题我用的是并查集,也就是将每次输入的一对关系都放到一个集合里面,然后最后将所有的认识的关系压缩到一个节点下,同通俗的说就是把一伙互相认识的人都归到其中一个人的名下,然后统计有多少伙人就可以了。中间有一个压缩路径的操作,不好讲,看代码就知道了。
View Code
解题报告:此题我用的是并查集,也就是将每次输入的一对关系都放到一个集合里面,然后最后将所有的认识的关系压缩到一个节点下,同通俗的说就是把一伙互相认识的人都归到其中一个人的名下,然后统计有多少伙人就可以了。中间有一个压缩路径的操作,不好讲,看代码就知道了。
#include<cstdio> #include<iostream> #include<algorithm> const int MAX = 1000+5; int T,a,b,N,M,prim[MAX]; int find(int k) { return prim[k]==k? k:(prim[k] = find(prim[k])); } int main() { scanf("%d",&T); while(T--) { scanf("%d%d",&N,&M); for(int i = 1;i<=N;++i) prim[i] = i; for(int i = 0;i<M;++i) { scanf("%d%d",&a,&b); if(a>b) std::swap(a,b); prim[find(a)] = find(b); } for(int i = 1;i<=N;++i) //这一步压缩路径,必要 , //将所有在一个集合内的元素压缩成所有前去节点相同 find(i); std::sort(prim+1,prim+N+1); int tot = 0; int c = -1; for(int i = 1;i<=N;++i) if(prim[i]!=c) { c = prim[i]; tot++; } printf("%d\n",tot); } return 0; }
View Code
相关文章推荐
- hdu杭电1213 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 How Many Tables 并查集
- HDU 1213 How Many Tables 并查集
- HDU 1213 How Many Tables(并查集)
- HDU--1213--How Many Tables【并查集】
- HDU-畅通工程-1232(并查集)How Many Tables(1213)
- hdu 1213 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 How Many Tables(并查集)
- HDU 1213-How Many Tables(简单并查集)
- HDU 1213 How Many Tables(并查集,简单)
- hdu 1213 How Many Tables 并查集模板题+路径压缩