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 }