码迷,mamicode.com
首页 > 其他好文 > 详细

并查集-----hrbust 1073

时间:2017-12-16 15:50:47      阅读:111      评论:0      收藏:0      [点我收藏+]

标签:font   put   post   一个   its   body   gpo   bsp   复杂   

1、链接

http://acm.hrbust.edu.cn/vj/index.php?c=problem-problem&id=9475

2、题目

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

 

3、分析:题意很清楚,只要有公共的祖先(fa[0])就加1

 

4、Code

#include<bits/stdc++.h>
using namespace std;
const int maxn = 50005;
int fa[maxn];

int find(int x){
/**
    Num1 时间复杂度更优
*/
 return fa[x] != x ? fa[x] = find(fa[x]) : fa[x];
//    int r = x;
//    while(fa[r] != r){
//        r = fa[r];
//    }
//    return r;
}

void unin(int x, int y){
    int fx = find(x);
    int fy = find(y);
    if(x < y){
        fa[fy] = fx;
    }
    else
        fa[fx] = fy;
}

int main(){
    int n,m;
    int u,v;
    while(~scanf("%d%d",&n,&m)){

        for(int i = 0; i < n; i++){
            fa[i] = i;
        }

        while(m--){
            scanf("%d%d",&u,&v);
            unin(u,v);
        }
        int ans = 0;
        for(int i = 0; i < n; i++){
            if(find(i) == fa[0])
                ans++;
        }
        printf("%d\n",ans);
    }
    return 0;
}

 

 

 

并查集-----hrbust 1073

标签:font   put   post   一个   its   body   gpo   bsp   复杂   

原文地址:http://www.cnblogs.com/hhkobeww/p/8046571.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!