您的位置:首页 > 其它

并查集初学——病毒

2016-04-07 14:52 239 查看
病毒

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),分别表示人数和接触关系数量;

在接下来的M行中,每行表示一次接触,;

每行包括两个整数U, V(0 <= U, V < N)表示一个直接朋友关系。

Output

输出数据仅包含一个整数,为共需隔离的人数(包含0号在内)。

Sample Input

100 4

0 1

1 2

3 4

4 5

Sample Output

3

#include<stdio.h>
int father[50005];
int n,m;
void chuhua()//初始化每个点为个体的根节点
{
int i;
for(i=0;i<n;i++)
{
father[i]=i;
}
}
int getfather(int x)//寻找根节点
{
int a=x;//保存这个需要找爸爸的点
while(a!=father[a])
{
a=father[a];
}
father[x]=a;//直接将这个点连到根节点上去(路径压缩)
return father[x];
}
void mix(int x,int y)//合并两个点的根节点
{
int fa=getfather(x);
int fb=getfather(y);
if(fa!=fb)
{
father[fa]=fb;
}
}
int main()
{——
int i,v1,v2;
while(~scanf("%d%d",&n,&m))
{
chuhua();
while(m--)
{
scanf("%d%d",&v1,&v2);
mix(v1,v2);
}
int p=getfather(0);
int s=0;
for(i=0;i<n;i++)
{
if(getfather(i)==p)
{
s++;
}
}
printf("%d\n",s);
}
return 0;
}


题目传送门:病毒(点击可交题)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: