【并查集】团伙

基础并查集

题目描述

1920年的芝加哥,出现了一群强盗。如果两个强盗遇上了,那么他们要么是朋友,要么是敌人。而且有一点是肯定的,就是:

我朋友的朋友是我的朋友;

我敌人的敌人也是我的朋友。

两个强盗是同一团伙的条件是当且仅当他们是朋友。现在给你一些关于强盗们的信息,问你最多有多少个强盗团伙。

输入输出格式

输入格式:

 

输入文件gangs.in的第一行是一个整数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是敌人。输入数据保证不会产生信息的矛盾。

 

题面非常短,哈……

题意的确还是挺好理解的。最早我做的时候,用了比较麻烦的图论方法:就是处理这张图,再对每一组连通分量各做处理,最后统计。

显然这是个累赘方法……

后来学习了一下HarryHu的方法,嗯……他去年11月就做掉了。对于每一个的敌人,我们记录一下,当下一次遇到他的另一个敌人时候,只需要将敌人合并就可以了,因为敌人间是朋友,并且其他人已经合并为同一个祖先了。

代码一:https://paste.ubuntu.com/p/jcPgpmsXNJ/

代码二:https://paste.ubuntu.com/p/fX24Y35yXD/

 

但是……

这就很mmp了对不对

但是非常感谢学长 CYC @一个懵了的人 找到了我代码中的读入错误。

由于luogu上本题数据是在windows下生成,文件里的换行符是“\r\n”,呃然后读入%d时候就出事了。

 

 

另外学到了另外一种新的读取无用字符的写法:

  scanf("%*c%*c"); 

 

 

 

posted @ 2018-02-21 21:41  AntiQuality  阅读(177)  评论(0编辑  收藏  举报