测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A27700. 团伙(group)

填空题 困难

题目描述

团伙(group)

题目描述

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

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

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

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

输入

第1行为n和m,1<n<1000,1<=m<=100 000;

以下m行,每行为p x y,p的值为0或1,p为0时,表示x和y是朋友,p为1时,表示x和y是敌人。

输出

一个整数,表示这n个人最多可能有几个团伙。

输入样例

6 4
1 1 4
0 3 5
0 4 6
1 1 2

输出样例

3

参考答案

#include<bits/stdc++.h> using namespace std; #define N 1005 int n, m, fa[N], enemy[N];//fa[i]:i的双亲 enemy[i]:i的某个敌人 void init(int n) { for(int i = 1; i <= n; ++i) fa[i] = i; } int find(int x)//查找x所在集合的根结点 { if(fa[x] == x) return x; return fa[x] = find(fa[x]); } void merge(int x, int y)//合并x,y所在的集合 { fa[find(x)] = find(y); } int main() { char opt; int p, q, ct = 0; cin >> n >> m; init(n); for(int i = 1; i <= m; ++i) { cin >> opt >> p >> q; if(opt == 'F') merge(p, q); else //opt = 'E' 敌人 { if(enemy[p])//如果p有敌人enemy[p] merge(enemy[p], q);//将q加入到p敌人组成的集合 else//如果p没有敌人 enemy[p] = q;//q作为p的敌人 if(enemy[q]) merge(enemy[q], p); else enemy[q] = p; } } for(int i = 1; i <= n; ++i) if(fa[i] == i)//i是根结点 ct++; cout << ct; return 0; }
上一题 下一题