团伙



问题描述:

1920年的芝加哥,出现了一群强盗。如果两个强盗遇上了,那么他们要么是朋友,要么是敌人。而且有一点是肯定的,就是:
我朋友的朋友是我的朋友;
我敌人的敌人也是我的朋友。
两个强盗是同一团伙的条件是当且仅当他们是朋友。现在给你一些关于强盗们的信息,问你最多有多少个强盗团伙。

输入格式:
第一行是一个整数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是敌人。输入数据保证不会产生信息的矛盾。
输出格式:
只有一行,表示最大可能的团伙数。
输入样例:
6
4
E 1 4
F 3 5
F 4 6
E 1 2
输出样例:
3



#include #include #include #include using namespace std; #define ms(a) memset(a,0,sizeof(a)) #define N 5005int parent[N]; //代表朋友 int em[N]; //代表敌人 int get_parent(int x){ int t=x; if(t!=parent[x]) t=get_parent(parent[x]); return t; }void merge(int x,int y){ int tx=get_parent(x); int ty=get_parent(y); if(tx!=ty){ parent[tx]=ty; } }int main(){ int n,m; int a,b; char s; while(cin>>n){ for(int i=1; i<=n; i++){ parent[i]=i; em[i]=0; } cin>>m; for(int i=1; i<=m; i++){ cin>>s>>a>>b; if(s=='F'){ merge(a,b); } else{ if(em[a]){ merge(em[a],b); } else{ em[a]=b; } if(em[b]){ merge(a,em[b]); } else{ em[b]=a; } } } int sum=0; for(int i=1; i<=n; i++){ if(parent[i]==i){ sum++; } } cout<


【团伙】





    推荐阅读