caioj1094·并查集3(校园白社会)
2017-07-25 10:25
246 查看
1094: 并查集3(校园白社会)
时间限制: 1 Sec 内存限制: 128 MB题目描述
校园内有很多白社会团伙,他们专做好事。经过长期的卧底,学校有n个人,任何两个认识的人不是朋友就是敌人,而且满足:①我朋友的朋友是我的朋友;②我敌人的敌人是我的朋友。所有是朋友的人组成一个团伙。现在拥有关于这n个人的m条信息(即某两个人是朋友,或某两个人是敌人),请你计算出这个城市最多可能有多少个白社会团伙。
数据范围:2≤N≤2000,1≤M≤5000。
输入数据
第一行包含一个整数N,第二行包含一个整数M,接下来M行描述M条信息,内容为以下两者之一:“F x y”表示x与y是朋友;“E x y”表示x与y是敌人(1≤x≤y≤N)。
输出数据
包含一个整数,即可能的最大团伙数。
样例输入
6
4
E 1 4
F 3 5
F 4 6
E 1 2
样例输出
3
//这题没全过
//过了83%回头再修改看看哪里有问题。
运用了一个反集和并查集的思想
1-n为朋友 n+1-2n为敌人集合
前面的自然用并查集即可
后面因为敌人的敌人是朋友
f[find(x+n)]=find(y);//x与y是敌人
f[find(y+n)]=find(x); //y的敌人与x是朋友
最后扫一遍谁的father还是自己那么就为一个团伙。
(p.s第一遍打成if(f[x!=x])结果过了83%,改回来结果56%….mi
#include<iostream> #include<cstdio> using namespace std; int n,m; int flag; int flag1[11000]; int f[2500]; int find(int x){ if (f[x]!=x]){ f[x]=find(f[x]); } return f[x]; } int main(){ int n,m; scanf("%d",&n); scanf("%d",&m); for (int i=1;i<=n*2;i++){ f[i]=i; } for(int i=1;i<=m;i++){ char p;int x,y; cin>>p>>x>>y; if (p=='F') f[find(x)]=find(y); if (p=='E') { f[find(x+n)]=find(y); f[find(y+n)]=find(x); } } int s=0; for (int i=1;i<=n;i++) if (f[i]==i) s++; printf("%d",s); return 0; }
相关文章推荐
- [caioj 1094] 并查集3(校园白社会)---带权并查集
- 1094: 并查集3(校园白社会)
- caioj1092: 并查集(模版 家族)
- 【NOI2002】caioj1095: 并查集4(银河英雄传说)
- caioj1092 并查集模板
- caioj1093: 并查集2(删边问题)
- Light-oj-1094 Farthest Nodes in a Tree (树的直径模板题)
- 杭电OJ4496 并查集 D-City
- 南京邮电大学OJ——1094蛇形填数
- [caioj]单调队列3 单调队列
- caioj1032· 递归2(组合)
- [caioj]1491: 基于连通性状态压缩的动态规划问题:Tony's Tour
- [caioj 1480,利用矩阵乘法解决的经典题目二]矩阵无限方
- caioj1031:递归1(全排列)
- [caioj 1425][状态压缩]游戏---状态压缩dp
- caioj1099: 线段树(元问题)线性结构求极值和修改
- 九度oj 1526 朋友圈 并查集
- [洛谷 P2857][caioj 1120] 牛选牛圈 --- 二分+网络流-最大流
- 【杭电oj】3038 - How Many Answers Are Wrong(带权并查集,好题)
- ACdreamoj1056(带权并查集)