计算朋友圈问题
假如已知有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;
}

浙公网安备 33010602011771号