这几天一直在刷并查集的题目,对于并查集的较难的题目,等着功力深厚了在做吧。
先说一下杭电上面的题目:并查集专题链接http://acm.hdu.edu.cn/problemclass.php?id=721
hdu1142:这题没有用并查集解决。先用dijkstra算法求出终点到其他各个顶点的距离,再用记忆化搜索求出满足条件的dp[1];
hdu1213:简单的并查集的应用。合并同类。
hdu1232:利用并查集判断图的联通性
hdu1272:再做一遍。
hdu1325:这题和poj的一个题一样
hdu1558:判断线段相交和简单并查集的应用。
hdu1856:简单并查集的应用
hdu3038:求错误答案的个数。修改并查集的并和查的函数。
hdu3047:和上一题很相似。
hdu3461:理解题意的基础上,用并查集和二分求幂。
hdu3635:如果在合并函数里更新每个龙珠的移动次数的话,会tle.要在查询函数里面更新。并且应该用scanf代替cin.
hdu3926:判断图是否同构。求出每个图的环的个数和链的个数。以及每个环和每个链包含的节点的个数。
剩下的5个题,暂时不会做。等过段时间再回来做。
poj上面的题目:
poj1308:判断是不是一棵树。要注意的地方:空是树;森林不是树;
poj1611:简单的并查集的应用
poj1703:找规律。修改find()和merge()。
poj2236:增加判断条件。
poj2492:找规律。修改find()和merge()。
poj1182:食物链的问题。找规律。修改find()和merge()。还有判断条件
poj还有很多有关并查集的题目,那些题目大多数和其他类型的题目相结合。比较难。
做了这20多道题目,感觉并查集的题目还是比较容易想思路的。以我现在的功力,大概只能将并查集分为两个大类:(可能不太准确)
1.简单的并查集应用。判断图的连通性等。这种情况下每个节点代表的类型与根节点代表的类型是相同的。不需要修改find()和merge()函数。有些时候可能只需要添加判断条件即可。这种情况下的并查集可以和很多小问题结合起来,也可能作为处理其他问题的前提条件(经过并查集的处理才能应用别的算法)
2.比较难的。此种情况下每个节点代表的类型与根节点代表的类型不相同。非根节点与根节点的关系可以有2种,3种等等。这种情况下,需要找出规律,就是枚举每个节点的取值情况,看得出的根节点的值。找出规律。往往需要修改find()函数和merge()函数,还要需要添加相应的判断条件。
并查集可能还有更多的分类,我感觉会随着做题的深入更加加深对并查集的理解的。