怎么做淘客手机网站,查征信怎么查 个人免费查询,用wordpress做购物网站,广告片精彩花絮团伙
luogu 1892
代码#xff1a;
定义对手的对手是朋友#xff0c;朋友的朋友是朋友#xff0c;现在有n个人和m组关系#xff0c;如果两个人是朋友那么他们属于同一个团伙#xff0c;问有多少个团伙
原题#xff1a;
题目描述
1920年的芝加哥#xff0c;出现了一…团伙
luogu 1892
代码
定义对手的对手是朋友朋友的朋友是朋友现在有n个人和m组关系如果两个人是朋友那么他们属于同一个团伙问有多少个团伙
原题
题目描述
1920年的芝加哥出现了一群强盗。如果两个强盗遇上了那么他们要么是朋友要么是敌人。而且有一点是肯定的就是 我朋友的朋友是我的朋友 我敌人的敌人也是我的朋友。 两个强盗是同一团伙的条件是当且仅当他们是朋友。现在给你一些关于强盗们的信息问你最多有多少个强盗团伙。
输入输出格式
输入格式
输入文件gangs.in的第一行是一个整数N(2N1000)表示强盗的个数从1编号到N。 第二行M(1M5000)表示关于强盗的信息条数。 以下M行每行可能是F p q或是E p q1p qNF表示p和q是朋友E表示p和q是敌人。输入数据保证不会产生信息的矛盾。
输出格式
输出文件gangs.out只有一行表示最大可能的团伙数。
输入输出样例
输入样例#1
6
4
E 1 4
F 3 5
F 4 6
E 1 2输出样例#1
3解题思路
记下每个人的敌人如果遇到敌人就和敌人的敌人合并如果遇到朋友就直接合并
代码
#includecstdio
#includecstring
#includeiostream
using namespace std;
int n,m,p,q,x1,y1,pd,ans,a[1005][1005],dad[1005];
char x;
int find(int dep){return dad[dep]dep?dep:dad[dep]find(dad[dep]);}//并查集
int main()
{scanf(%d %d,n,m);for (int i1;in;i)dad[i]i;for (int i1;im;i){cinx;while (x!Ex!F) cinx;//读入scanf(%d %d,p,q);if (xF){x1find(p);//合并y1find(q);dad[min(x1,y1)]max(x1,y1);}else{for (int j1;ja[p][0];j)//敌人的敌人{if (a[p][j]q) continue;x1find(a[p][j]);y1find(q);dad[min(x1,y1)]max(x1,y1);}for (int j1;ja[q][0];j)//反过来也要{if (a[q][j]p) continue;x1find(a[q][j]);y1find(p);dad[min(x1,y1)]max(x1,y1);}a[p][a[p][0]]q;//记下来a[q][a[q][0]]p;}}for (int i1;in;i){pd1;for (int ji1;jn;j)if (find(i)find(j))//看是否在同一个团伙{pd0;break;}if (pd) ans;}printf(%d,ans);
}