P1892 团伙

     题目链接;

题目大意:
     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 }
View Code

     

猜你喜欢

转载自www.cnblogs.com/LiqgNonqfu/p/9827787.html
今日推荐