您的位置:首页 > 其它

HDU 1213 How Many Tables 并查集

2015-04-22 16:35 309 查看
题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=66964#problem/C

题意:相互认识的人坐同一张桌子,认识具有传递性,典型的并查集求解。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;

int N,M,vis[1010],pre[1010];

int find(int x){
int t=x;
while(t!=pre[t]) t=pre[t];
while(x!=t) pre[x]=t,x=pre[x];
return t;
}

int main(){
//freopen("D:\\in.txt","r",stdin);
int T;cin>>T;
while(T--){
cin>>N>>M;
int a,b;
memset(vis,0,sizeof(vis));//点出现标志
for(int i=0;i<=N;i++) pre[i]=i;
for(int i=0;i<M;i++){
scanf("%d %d",&a,&b);
if(vis[a]) pre[find(b)]=find(a);
else pre[find(a)]=find(b);
vis[a]=vis[b]=1;
}
int cnt=0;
for(int i=1;i<=N;i++) if(find(i)==i) cnt++;//别犯老错误
cout<<cnt<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: