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 }

 

posted @ 2021-01-06 10:17  TFLSNOI  阅读(687)  评论(0编辑  收藏  举报