您的位置:首页 > 其它

HDU 1213 How Many Tables 并查集

2013-07-30 20:20 337 查看
题目描述:Ignatius,这个人过生日,然后请了很多朋友来聚会,然后并不是他的所有的朋友都互相认识,现在给出他的朋友们相互认识的情况,并且规定,如果1认识2,2认识3,则1认识3,要求每一伙认识的朋友坐在一张桌子上,然后要求一共需要多少张桌子。

解题报告:此题我用的是并查集,也就是将每次输入的一对关系都放到一个集合里面,然后最后将所有的认识的关系压缩到一个节点下,同通俗的说就是把一伙互相认识的人都归到其中一个人的名下,然后统计有多少伙人就可以了。中间有一个压缩路径的操作,不好讲,看代码就知道了。

#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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: