zoukankan      html  css  js  c++  java
  • POJ 1611---The Suspects(并查集)

    题意:0疑似有传染病,和0在一起的都疑似被传染(这些人也会传染别人),求有多少个人可能有传染病;

    直接代码+注释(16ms)

     方法1:

     1 #include<stdio.h>
     2 #include<algorithm>
     3 #include<string.h>
     4 using namespace std;
     5 
     6 const int maxn=20000000;
     7 int par[maxn],m,n;
     8 
     9 int find(int x)
    10 {
    11     if(x!=par[x])
    12         par[x]=find(par[x]);
    13     return par[x];
    14 }
    15 
    16 void unionn(int a,int b)
    17 {
    18     int fa=find(a);
    19     int fb=find(b);
    20     if(par[fb]!=fb) par[fa]=fb;     //如果fb不是头 fa并入fb即头为fb
    21     else par[fb]=fa;                //如果fb是头 fb并入fa
    22 }
    23 
    24 int main()
    25 {
    26     while(scanf("%d%d",&n,&m)&&(m||n)){
    27         int p,a,b;
    28         for(int i=0;i<=n;i++){
    29             par[i]=i;                //每个人的头为自己
    30         }
    31         while(m--){
    32             scanf("%d",&p);
    33             p--;
    34             scanf("%d",&a);
    35             for(int i=0;i<p;i++){
    36                 scanf("%d",&b);
    37                 unionn(a,b);          //a后边的所有元素都并入a即a为头
    38             }
    39         }
    40         int sum=0;
    41         for(int i=0;i<n;i++){
    42             while (par[i]!=i&&par[i]!=par[par[i]])      //如果i不是头并且i的上一级也不是头 找i的头 par[i]=头
    43                 par[i]=par[par[i]];
    44         }
    45         for(int i=0;i<n;i++){
    46             if(par[i]==par[0]) sum++;               //谁和0是同一个头 说明被传染
    47         }
    48         printf("%d
    ",sum);
    49     }
    50     return 0;
    51 }

     方法二:(方法二和方法一意思差不多,就是更简洁了一些)

     1 #include<stdio.h>
     2 #include<algorithm>
     3 #include<string.h>
     4 using namespace std;
     5 
     6 const int maxn=300100;
     7 int par[maxn],m,n;
     8 
     9 int find(int x)
    10 {
    11     if(x!=par[x])
    12         par[x]=find(par[x]);
    13     return par[x];
    14 }
    15 
    16 void unionn(int a,int b)
    17 {
    18     int fa=find(a);
    19     int fb=find(b);
    20     if(fa==fb) return;
    21     else par[fb]=fa;
    22 }
    23 
    24 int main()
    25 {
    26     while(scanf("%d%d",&n,&m)&&(m||n)){
    27         int p,a,b;
    28         for(int i=0;i<=n;i++){
    29             par[i]=i;
    30         }
    31         while(m--){
    32             scanf("%d",&p);
    33             p--;
    34             scanf("%d",&a);
    35             for(int i=0;i<p;i++){
    36                 scanf("%d",&b);
    37                 unionn(a,b);
    38             }
    39         }
    40         int sum=0;
    41         for(int i=0;i<n;i++){
    42             if(find(i)==find(0)) sum++;
    43         }
    44         printf("%d
    ",sum);
    45     }
    46     return 0;
    47 }
  • 相关阅读:
    C#和Modbus通信工程
    C#中JS和Flash中AS 3.0通信交互
    创建型-建造者模式(Builder)
    结构型-享元模式(Flyweight)
    行为型-模板方法模式(Template Method)
    创建型-原型模式(Prototype)
    行为型-状态模式(State)
    结构型-桥接模式(Bridge)
    行为型-中介者模式(Mediator)
    行为型-备忘录模式(Memento)
  • 原文地址:https://www.cnblogs.com/lilibuxiangtle/p/11330481.html
Copyright © 2011-2022 走看看