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