并查集水题
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代码如下:
示例数据:输入: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; }
相关文章推荐
- L2-010. 排座位(并查集水题)
- ABBYY Cup 2.0 - Easy, problem: (C1) Party 并查集水题
- HDU 1232--畅通工程【水题,并查集】
- POJ 1611--The Suspects【并查集水题】
- 修复公路 洛谷1111 并查集 水题
- 修复公路 洛谷1111 并查集 水题
- POJ2236 wireless network 【并查集水题】
- hdu 1213 How Many Tables(并查集水题)
- C. PolandBall and Forest----并查集水题
- 【2802】SDUTOJ (并查集模板水题2)
- HDU 4496 D-City (并查集,水题)
- 并查集-水题
- 修复公路 洛谷1111 并查集 水题
- D - How Many Tables (并查集)(水题)
- 【2802】SDUTOJ (并查集模板水题2)
- HDU1232 畅通工程 并查集(第一题) 水题
- The Suspects POJ - 1611 并查集水题
- UVA - 10608 Friends 并查集水题
- POJ 1308 并查集的水题
- 并查集,带权,水题PKOJ1703