• 1385:团伙(group)


    http://ybt.ssoier.cn:8088/problem_show.php?pid=1385

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int fa[1005];
     4 vector<int> dr[1005];//记录每个人的敌人 
     5 int n, m;
     6 int p, x, y;
     7 int ans;
     8 void init(){
     9     for(int i=1; i<=n; i++)
    10         fa[i]=i;
    11 }
    12 int find(int x){
    13     if(fa[x]!=x)
    14         fa[x]=find(fa[x]);
    15     return fa[x];
    16 }
    17 void merge(int x, int y){
    18     int xx=find(x);
    19     int yy=find(y);
    20     fa[xx]=yy;
    21 }
    22 int main()
    23 {
    24     scanf("%d%d",&n,&m);
    25     init();//初始化 
    26     while(m--){
    27         scanf("%d%d%d",&p,&x,&y);
    28         if(p==1){
    29             if(dr[x].size()==0 && dr[y].size()==0){//如果x,y都没有敌人,互相加为敌人 
    30                 dr[x].push_back(y);
    31                 dr[y].push_back(x);
    32             }
    33             else if(dr[x].size()){//如果x有敌人,则x的敌人都是y的朋友 
    34                 for(int i=0; i<dr[x].size(); i++)
    35                     merge(dr[x][i], y);//合并x的敌人和y为团伙 
    36                 dr[x].clear();//清除x的敌人,因为已经找到团伙 
    37             }
    38             else if(dr[y].size()){//如果y有敌人,则y的敌人都是x的朋友
    39                 for(int i=0; i<dr[y].size(); i++)
    40                     merge(x, dr[y][i]);//合并y的敌人和x为团伙 
    41                 dr[y].clear();//清除y的敌人,因为已经找到团伙 
    42             }
    43         }
    44         if(p==0){
    45             merge(x, y);//合并朋友 
    46         }
    47     }
    48     for(int i=1; i<=n; i++){
    49         if(fa[i]==i)ans++;//找团伙头目 
    50     }
    51     printf("%d",ans);
    52     return 0;
    53 }
  • 相关阅读:
    ELK安装(ubuntu)
    Ubuntu18.04上安装java
    .net core跨平台的文件路径
    缺少vim
    docker进入容器
    docker删除名字为none的imgae
    Ubuntu18.04上安装Docker-Compose
    Java类的反射
    Java常用类(二) Scanner类和大数类
    Java常用类(一)Math类和Random类
  • 原文地址:https://www.cnblogs.com/tflsnoi/p/14239532.html
Copyright © 2020-2023  润新知