团伙

问题描述:

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<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
#define ms(a) memset(a,0,sizeof(a))
#define N 5005

int 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<<sum<<endl;
	} 

	return 0;
}

    原文作者:犯罪团伙问题
    原文地址: https://blog.csdn.net/weixin_41082100/article/details/80257362
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞