Description |
某种病毒袭击了某地区,该地区有N(1≤N≤50000)人,分别编号为0,1,...,N-1,现在0号已被确诊,所有0的直接朋友和间接朋友都要被隔离。例如:0与1是直接朋友,1与2是直接朋友,则0、2就是间接朋友,那么0、1、2都须被隔离。现在,已查明有M(1≤M≤10000)个直接朋友关系。如:0,2就表示0,2是直接朋友关系。 |
Input |
第一行包含两个正整数N(1≤N≤50000),M(1≤M≤100000),分别表示人数和接触关系数量; |
Output |
输出数据仅包含一个整数,为共需隔离的人数(包含0号在内)。 |
Sample Input |
100 4 |
Sample Output |
3 |
由于0号已经确诊感染病毒,那么只需找出0号的直接朋友与间接朋友即可。
代码如下:
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
int n,m;
int i;
int fa[50005];
void inin(int n) //初始化 使每个成员的父亲都是他自己
{
for(i=0; i<n; i++)
{
fa[i]=i;
}
return ;
}
int getf(int n) //利用递归 找到n的父亲
{
if(fa[n]==n) //如果n的父亲是他自己 那么返回n;
{
return n;
}
else //如果不是 进行递归操作
{
fa[n]=getf(fa[n]);
return fa[n];
}
}
void hr(int v,int j)
{
int fv,fj; //fv为v的父亲,fj为j的父亲
fv=getf(v);
fj=getf(j);
if(fv<fj) //如果fv<fj 那么把fv作为fj的父亲
{
fa[fj]=fv;
}
else if(fv>fj) //如果fv>fj 那么把fj作为fv的父亲
{
fa[fv]=fj;
}
return;
}
int main()
{
int x,y;
while(cin>>n>>m)
{
memset(fa,0,sizeof(fa));
inin(n); //调用函数对数组 fa 进行初始化
int ans=0;
for(i=1; i<=m; i++)
{
cin>>x>>y;
hr(x,y);
}
for(i=0; i<n; i++) //遍历0-n 如果i的父亲等于0的父亲 那么 ans++
{
if(getf(i)==fa[0])
{
ans++;
}
}
cout<<ans<<endl;
}
return 0;
}