1526朋友圈问题--并查集练习

馋奶兔 提交于 2019-12-23 03:14:30

题目描述:
假如已知有n个人和m对好友关系(存于数字r)。如果两个人是直接或间接的好友(好友的好友的好友...),则认为他们属于同一个朋友圈,请写程序求出这n个人里一共有多少个朋友圈。
假如:n = 5 , m = 3 , r = {{1 , 2} , {2 , 3} , {4 , 5}},表示有5个人,1和2是好友,2和3是好友,4和5是好友,则1、2、3属于一个朋友圈,4、5属于另一个朋友圈,结果为2个朋友圈。

输入:
输入包含多个测试用例,每个测试用例的第一行包含两个正整数 n、m,1=<n,m<=100000。接下来有m行,每行分别输入两个人的编号f,t(1=<f,t<=n),表示f和t是好友。 当n为0时,输入结束,该用例不被处理。

输出:
对应每个测试用例,输出在这n个人里一共有多少个朋友圈。

样例输入:
5 3
1 2
2 3
4 5
3 3
1 2
1 3
2 3
0
样例输出:
2
1
 

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int f[10000],n,m,a,b;
void init() //初始化
{
    for(int i=0; i<n; i++)
        f[i] = i;
}
int find(int x)//找上级
{
    return f[x]==x?x:f[x]=find(f[x]);

}
void merge(int x,int y)//合并
{
    int fx = find(x);
    int fy = find(y);
    if(fx != fy)
        f[fx] = fy;
}
int main()
{
    while(~scanf("%d",&n)&& n!=0)//~ 非 
    {
        scanf("%d",&m);
        init();
        while(m--)
        {
            scanf("%d%d",&a,&b);
            merge(a,b);
            //printf("%d%d\n",a,b);
        }
        int cnt = 0;
        for(int i = 0; i < n; i++)
        {
            //printf("f[%d] = %d\n",i,f[i]);
            if(f[i] == i)
                cnt++;
        }
        printf("%d\n",cnt);
    }
    return 0;
}

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!