http://acm.hdu.edu.cn/showproblem.php?pid=1213
题目大意:
Ignatius要过生日 请他的朋友们吃饭 Ignatius想知道他至少需要多少张桌子
并不是所有的朋友都认识对方,而且所有的朋友都不想和陌生人呆在一起
规则是 如果A知道B B知道C 那就意味着A B C知道对方 所以他们可以呆在一张桌子上
例如 A知道B B知道C D知道E 所以A B C可以放在一个表中 D E必须留在另一个表中 因此Ignatius至少需要两张桌子
分析:
简单的并查集
AC代码:
#include <stdio.h>
int pre[1005];
int find(int n){
int flag=n;
while (pre[flag]!=flag){
flag=pre[flag];
}
int i=n;
int temp;
while (i!=flag){// 路径压缩
temp=pre[i];
pre[i]=flag;
i=temp;
}
return flag;
}
void join(int x,int y){
int fx=find(x);
int fy=find(y);
if (fx!=fy){
pre[fx]=fy;
}
}
int main (){
int t;
scanf ("%d",&t);
while (t--){
int N,M;
scanf ("%d%d",&N,&M);
for (int i=1;i<=N;i++){
pre[i]=i;
}
for (int i=0;i<M;i++){
int a,b;
scanf ("%d%d",&a,&b);
join(a,b);
}
int sum=0;
for (int i=1;i<=N;i++){
if(i==find(i))// 有几个根节点就需要几张桌子
sum++;
}
printf ("%d\n",sum);
}
return 0;
}
1315

被折叠的 条评论
为什么被折叠?



