哈理工oj 1073 病毒

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

由于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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值