您的位置:首页 > 其它

并查集水题

2018-03-31 15:28 134 查看
已知n个人序号为1-n,分别属于若干个团队,有m条线索表明某两个人属于同一个团队,那么这n个人一共有几个团队。输入第一行为两个数n和m,第2到m+1行为m条线索:每行两个数a,b表示序号为a和为b的两个人在同一队伍中。输出为一个数,表示队伍个数。

示例数据:输入:10 9
1 2
3 4
5 2
4 6
2 6
8 7
9 7
1 6
2 4输出:3代码如下:
#include <iostream>
#include <cstdio>

using namespace std;

const int maxn=1000;
int f[maxn];

void init(int n) {				//初始化
for(int i=1;i<=n;i++) {
f[i]=i;				// 开始时上级定义为自己
}
}

int getf(int x) {				//寻找队长
if(x==f[x])
return x;			//如果上级为自己,则自己为该团队的队长,返回自己的序号
return getf(f[x]);			//否则,继续寻找自己上级的上级
}

void merge(int a,int b) {		        //合并
int t1=getf(a);				//t1为a的队长
int t2=getf(b);				//t2为b的队长
if(t1!=t2) {				//如果t1和t2不等,即目前两人不在同一团队
f[t2]=t1;			//将t1设为t2的上级
}
}

int main() {
int n,m;				//n个人,m条线索
scanf("%d%d",&n,&m);
init(n);
for(int i=0;i<m;i++) {
int a,b;
scanf("%d%d",&a,&b);	        //a,b是相互关联的,即在同一团队中
merge(a,b);			//合并
}
int sum=0;				//sum用来记录队长个数,即队伍个数
for(int i=0;i<n;i++) {
if(f[i]==i) {			//找到一个队长,sum加一
sum++;
}
}
printf("%d",sum);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  并查集