1.Wireless Network

题意:输入N(电脑数量),d(电脑修复后可联系的范围); 输入N台电脑的坐标,输入0&id代表修复编号为id的电脑,输入S X Y代表询问X,Y是否能 直接联系/间接联系

思路:对于可联系的所有ID,均放到一个集合,想到并查集的作用,把具有相同性质(一定关联性)的东西放在一棵树上,并可以进行查询。


2.The Suspects

题意:输入n(学生数量),m(团体组织);每个团体开头先输入num  再输入编号,一个学生可以加多个团队,0号是嫌疑人,只要和0号有间接/直接有关系的人都是嫌疑人

思路:对于有一定关系的人,利用并查集合并之。问题是如何维护当前这棵树的节点数(根节点是关键)。可以很自然的想到,一开始初始化每一个cnt[id]=1;每次合并Find(X) Find(Y)时候,cnt[father]+=cnt[son];但要注意一点,如果Find(X)==Find(Y)  即X,Y均为嫌疑人的情况下,无需加,否则答案*2就错误了。


3.How Many Tables?

题意:朋友的朋友就是自己的朋友,可以坐在一张桌子。每组数据输入N(学生数量),M(关系对),问至少需要几张桌子

思路:很明显的并查集,问最后又几棵树(whoes par[i]==i)O(n)循环一遍


4.How Many Answer Are Wrong

题意:见上篇


5.食物链

题意:A,B,C三种动物存在捕食圈的关系,即A->B->C->A。输入n(动物数量),k(关系对)。问有几个话是假的。

思路:不是假的话,那就是真的(先到先得)。重点在如何维护捕食关系。

若为1 X Y,判断X和Y是否存在捕食关系  Find(x)==Find(y+n) || Find(x+n)==Find(y) ,;若为同类,那么unite(x,y),unite(x+n,y+n),unite(x+2*n,y+2*n);

若为2 X Y,判断Y会不会吃X,X和Y是不是同类Find(x)==Find(y) || Find(y+n)==Find(x) 。如果X吃Y成立,那么unite(x+n,y),unite(x,y+2*n),unite(y+n,x+2*n)

只维护是否同类以及吃谁是没法解决问题的。因为忽略了被吃的关系。

 


6.A Bug's Life

题意:每组数据输入n(昆虫数量),m(关系对,交配,先到先得原则)。问是不是存在同性恋的昆虫。

思路:开2*n数组,id对应的id+n代表可以与id交配的昆虫。如果两只当前Find(x)==Find(y),说明有同性恋昆虫;否则没有。


7.Connections In Galaxy War

题意:输入n,接着是 n个星球的能量值power[i]。输入m,接下来是m行关系对,代表星球x,y互相联通。输入q,紧接着是q次操作,如果是query x,则询问x是否满足要求。如果是destory x y 代表破坏x,y之间的联通。  要求为:能够和能量比自己大的星球联通。

思路:顺着思考的话destory x y是一件很麻烦的事情,因为它们的father在合并的时候变化了,根本无法删边。逆着想,我先把所有输入保存下来。建立一张连通图(除了destory x y),这是最后所有被destory的状态。再逆着往回遍历就是加边的操作。加边就容易了,一般的并查集题。


8.小希的迷宫

题意:给定一张图的联通关系,问是否满足条件:1.每两个节点 有且只有一条路径 2.只有一张图

思路:if(Find(x)==Find(y)) 那就是有2条路径,否则合并。还要判断是否只有一张图,看一下所有节点的根节点是否一致即可。


9.Is it a tree?

题意:给一张有向图,问是不是一棵树。

思路:1.每2个节点仅有一条通道 ; 2.只有一张图  ; 3.所有节点的入度均<=1 , 在第八题代码稍作修改就可以了


10.Find them,and catch them

题意:输入n(人数),m(操作次数) ;A X Y代表 X Y属于不同阵营,D X Y 表示询问X , Y 是否为同一阵营

思路:若为A X Y ,unite(X,Y+N),unite(Y+N,X) 。若为D X Y, Find(x)==Find(y)同阵营;Find(x)==Find(y+n)敌对阵营;否则不知道确切情况。


11.Supermarket

题意:输入n件商品的价值以及保质期。每天只能买一件商品,问可获得的最大价值是多少。

思路:贪心每一天的价值最大。再把价值大的尽量往后排,腾出前面买的时间。


总结:并查集用于合并具有同一性质/一定关系的集合,根节点可以作为一个代表。有时可以通过开 (关系)*n 数组来维护关系。