hrbust 病毒 并查集

来源:互联网 发布:国事访问知乎 编辑:程序博客网 时间:2024/05/16 10:20

找不到题号了
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 fa[50005],n,m,x,y;void init(){    for(int i = 0;i < n;++i) fa[i] = i;}int find(int x){    return fa[x]!=x?fa[x] = find(fa[x]):fa[x];}void unin(int a,int b){    if(a>b) fa[find(a)] = find(b);    else fa[find(b)] = find(a);    return;}int main(){    while(scanf("%d%d",&n,&m)!=EOF)    {        init();        while(m--)        {            scanf("%d%d",&x,&y);            unin(x,y);        }        int ans = 0;        for(int i = 0;i < n;++i)        {            if(find(i)==fa[0]) ans++;        }        printf("%d\n",ans);    }    return 0;}