2597 团伙(并查集就是好用!)

2597 团伙

 

时间限制: 1 s
空间限制: 128000 KB
题目等级 : 黄金 Gold
 
题目描述 Description

1920年的芝加哥,出现了一群强盗。如果两个强盗遇上了,那么他们要么是朋友,要么是敌人。而且有一点是肯定的,就是:

我朋友的朋友是我的朋友;

我敌人的敌人也是我的朋友。 

两个强盗是同一团伙的条件是当且仅当他们是朋友。现在给你一些关于强盗们的信息,问你最多有多少个强盗团伙。

输入描述 Input Description

输入文件gangs.in的第一行是一个整数N(2<=N<=1000),表示强盗的个数(从1编号到N)。 第二行M(1<=M<=5000),表示关于强盗的信息条数。 以下M行,每行可能是F p q或是E p q(1<=p q<=N),F表示p和q是朋友,E表示p和q是敌人。输入数据保证不会产生信息的矛盾。

输出描述 Output Description

输出文件gangs.out只有一行,表示最大可能的团伙数。

样例输入 Sample Input

6
4
E 1 4
F 3 5
F 4 6
E 1 2

样例输出 Sample Output

3

数据范围及提示 Data Size & Hint

2<=N<=1000

1<=M<=5000

1<=p q<=N

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 #define N 1010
 6 int far[N];
 7 int n,m;
 8 int a,b;
 9 char q; 
10 int enemy[N][N];  //记录下敌人 
11 int vis[N];
12 int ans;
13 int Find_(int a)  //查找最顶端的元素 
14 {
15     if(far[a]!=a)far[a]=Find_(far[a]);
16     return far[a];
17 }
18 void In_()  //输入 
19 {
20     scanf("%d%d",&n,&m);
21     for(int i=1;i<=n;++i)  //初始化 
22         far[i]=i;
23     for(int i=1;i<=m;++i)
24     {
25         cin>>q;
26         scanf("%d%d",&a,&b);
27         if(q=='F')
28         {
29             int r=Find_(a);
30             int rr=Find_(b);
31             if(r!=rr)far[rr]=r;  //进行合并 
32         }
33         else {
34             enemy[a][++enemy[a][0]]=b;  //记下敌人 
35             enemy[b][++enemy[b][0]]=a;
36         }
37     }
38 }
39 void Work_()
40 {
41     for(int j=1;j<=n;++j)  //遍历所有人的敌人 将敌人人的敌人变成朋友 
42     {
43         for(int i=1;i<enemy[j][0];++i)
44         {
45             int r=Find_(enemy[j][i]);
46             int rr=Find_(enemy[j][i+1]);
47             if(r!=rr)far[rr]=r;
48             else continue;
49         }
50     }
51     memset(vis,0,sizeof(vis));
52     for(int i=1;i<=n;++i)
53     {
54         vis[Find_(i)]=1;  
55     }
56     for(int i=1;i<=n;++i)
57     {
58         if(vis[i])ans++; //记下多少个团伙 
59     }
60 }
61 void Out_()  //输出 
62 {
63     cout<<ans; 
64 }
65 int main()
66 {
67     In_();
68     Work_();
69     Out_();
70     return 0;
71 }

 

posted @ 2017-04-12 20:15  MJT12044  阅读(209)  评论(0)    收藏  举报