计算朋友圈问题

假如已知有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个朋友圈

#include <iostream>
using namespace std;
 
int FindLeader(int a,int *set)   //返回a的领导
{
    if(a == set[a])
        return set[a];
    else
        return FindLeader(set[a], set);
}
 
int main(int argc, const char * argv[])
    {
 
    int n,m;
    cin>>n>>m;
    
    int *set =new int[n+1];   
    for(int i=0;i<=n;i++)
        set[i] = i;              //初始化列表,每个人都是各自的领导
    int b[m][2];
        int tmp;
    for(int j=0;j<m;j++)
    {
        cin>>b[j][0]>>b[j][1];    //输入好友关系
        if(b[j][0]>b[j][1])       
        {
            if(set[b[j][1]] != b[j][1])      
                tmp = FindLeader(b[j][1], set);
            else
                tmp = b[j][1];
            set[b[j][0]] =tmp;    //指向小值得领导
        }
        else if(b[j][0]<b[j][1])
        {
            if(set[b[j][0]] != b[j][0])
                tmp = FindLeader(b[j][0], set);
            else
                tmp = b[j][0];
            set[b[j][1]] =tmp;
        }
    }
    int count = 0;
    for(int i=1;i<=n;i++)
    {
        if(set[i] == i)      //自己还是自己的领导,说明有一个朋友圈
            ++count;
    }
    
    cout << count<<endl;
    return 0;
}

  

 
posted @ 2020-07-28 11:00  执著的追求  阅读(186)  评论(0)    收藏  举报