bzoj 1370 Gang团伙

题目大意:

在某城市里住着n个人,任何两个认识的人不是朋友就是敌人,满足

1、 我朋友的朋友是我的朋友

2、 我敌人的敌人是我的朋友

所有是朋友的人组成一个团伙 告诉你关于这n个人的m条信息,即某两个人是朋友,或者某两个人是敌人,计算出这个城市最多可能有多少个团伙

思路:

对于每个人用两个点表示

一个点所在集合表示这个人的朋友所在集合

另一点所在结婚表示这个人的敌人所在集合

然后并查集即可

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cmath>
 5 #include<cstdlib>
 6 #include<cstring>
 7 #include<queue>
 8 #include<map>
 9 #include<vector>
10 #define ll long long
11 #define inf 2147483611
12 #define MAXN 1010
13 using namespace std;
14 inline int read()
15 {
16     int x=0,f=1;char ch=getchar();
17     while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
18     while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}
19     return x*f;
20 }
21 int n,f[MAXN*2],ans;
22 bool hsh[MAXN*2];
23 int find(int x) {return x==f[x]?x:f[x]=find(f[x]);}
24 int main()
25 {
26     n=read();
27     int Q=read(),a,b,fa,fb;char ch[3];
28     for(int i=1;i<=2*n;i++) f[i]=i;
29     while(Q--)
30     {
31         scanf("%s",ch);a=read(),b=read();
32         if(ch[0]=='E')
33         {
34             fa=find(a+n),fb=find(b);
35             if(fa!=fb) f[fa]=fb;
36             fa=find(a),fb=find(b+n);
37             if(fa!=fb) f[fa]=fb;
38         }
39         else
40         {
41             fa=find(a),fb=find(b);
42             if(fa!=fb) f[fa]=fb;
43         }
44     }
45     for(int i=1;i<=n;i++)
46     {
47         a=find(i);
48         if(!hsh[a]) hsh[a]=1,ans++;
49     }
50     printf("%d",ans);
51 }
52 
View Code

 

posted @ 2017-11-19 19:56  jack_yyc  阅读(160)  评论(0编辑  收藏  举报