题目大意:
n个海盗要么是朋友要么是敌人(A的敌人的敌人是A朋友),海盗团伙当且仅当这群海盗都是朋友,给出部分海盗关系(m条),要求输出团伙个数。
思路:
如果是朋友,就合并到一起;
如果是敌人,自己之前已有敌人就将对方与自己的敌人合并到一起,若没有,就记录这个敌人。
用一个数组en[i]存储i的敌人的父亲就好。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 5 using namespace std; 6 7 int f[1008],en[1004]; 8 int n,m; 9 10 int find(int x) 11 { 12 if(f[x]!=x)f[x]=find(f[x]); 13 return f[x]; 14 } 15 16 void uni(int x,int y) 17 { 18 int xx=find(x); 19 int yy=find(y); 20 f[yy]=xx; 21 } 22 23 int main() 24 { 25 scanf("%d%d",&n,&m); 26 for(int i=1;i<=n;i++)f[i]=i; 27 for(int i=1;i<=m;i++) 28 { 29 int q,p; 30 char ch; 31 ch=getchar(); 32 while(ch!='F'&&ch!='E')ch=getchar(); 33 scanf("%d%d",&q,&p); 34 if(ch=='F')uni(q,p); 35 else 36 { 37 if(en[q]) 38 { 39 uni(en[q],p); 40 en[q]=find(p); 41 } 42 else 43 { 44 en[q]=find(p); 45 } 46 if(en[p]) 47 { 48 uni(en[p],q); 49 en[p]=find(q); 50 } 51 else 52 { 53 en[p]=find(q); 54 } 55 } 56 } 57 int ans=0; 58 for(int i=1;i<=n;i++) 59 { 60 if(f[i]==i)ans++; 61 } 62 printf("%d\n",ans); 63 return 0; 64 }
扫描二维码关注公众号,回复:
3670470 查看本文章