CSDN博客

img sunacmer

POJ 1611

发表于2008/9/30 10:11:00  1770人阅读

已经几天没做题了,前几天在看动态规划,但觉得动态规划好像太博大精深了,形式多种多样,复杂的时候可以很复杂,而简单的时候又很简单,具体问题要很具体的分析,没有一个很固定的架子。什么时候有时间了再继续看,昨天开始看了下并查集。
并查集也是一种集合,支持的操作有查找某个元素属于哪个集合和集合的快速合并。是用树实现的,这里的树是用顺序存储即数组实现的,具体为用一个数组记录某个元素父亲的下标,看了很多说并查集的,处理的数据好像都是整数,觉得其他类型的肯定也可以了,比如加一个整型的数据成员等的。并查集的具体操作为在开始的时候将每个元素初始化为一个集合,在第一次查找的时候,返回的是该元素,之后再找该元素的时候返回的就是该元素父亲的下标。并查集的合并还有加权合并,即合并两个根的时候,将元素个数多的根结点作为元素个数少的根结点的父结点,此外还有路径的压缩,再继续看了,呵呵。说了半天,觉得自己说的很乱,想到什么就说什么了,也很多东西都没说清楚,如果万一有人看到了,没看明白的话,可以问下我,一起讨论下,嘿嘿。我是菜鸟~~
刚做了POJ1611,这是第一个并查集的题,呵呵。其实这也就是一个等价类问题,每个组的元素都是等价的,即每两个元素都是一个等价对,在用并查集划分等价类的时候,如果设有n个元素m个等价对,则需要2m次find操作,每两次find要union一次。而对于这道题,已经给出了很多等价元素,则只需要用后面的元素和第一个元素union就好了,不用每两个union,不然可能会超时。
记一下过程,一开始老是RE,不知道为什么,后来把输入改了下,原来的代码为:
scanf("%d%d",&num,&first);//num是每行的元素个数,first是元素中的第一个,即用来每次和后面的元素union
后来改成了两次scanf:
scanf("%d%d",&num);
scanf("%d",&first);
但还是出错了,当然了,这次是因为第一个scanf多了一个%d,删了然后就AC了~很奇怪不知道连到一起和分开有什么区别~有时间再仔细看看了,连基本的输入输出还有问题~失败~呵呵。
0 0

相关博文

我的热门文章

img
取 消
img