在poj上做了一些题,在贡献ac的同时,贡献了π(e^n)的wa,tl,ml和re。现在就来总结一下这一个多礼拜对并查集的感受,也把并查集的标程写出来以备后用。
经过不断的改进,以上的代码效率已经比较高了。特别要注意的是parent一定要初始化为-1!!!
- // 寻找集合的头元素
- // 并对路径进行压缩
- // notice: 在main里边要将parent全部初始化为-1
- int Find(int x)
- {
- if(parent[x] >= 0) {
- parent[x] = Find(parent[x]);
- return parent[x];
- }
- else
- return x;
- }
- // 另外的一个Find版本,效率较低
- //但能避免以上Find可能导致的MLE
- int Find(int x)
- {
- int px = x,temp;
- while(parent[x] >= 0)
- x = parent[x];
- while(px != x) {
- temp = parent[px];
- parent[px] = x;
- px = temp;
- }
- return x;
- }
- // 合并集合
- // 这里将层次低的加入层次高的
- // 这样降低了这棵树的高度和Find的时间复杂度
- void Union(int x,int y)
- {
- x = Find(x);
- y = Find(y);
- if( x == y)
- return ;
- if(parent[x] < parent[y])
- parent[y] = x;
- else
- if(parent[x] > parent[y])
- parent[x] = y;
- else {
- parent[x]--;
- parent[y] = x;
- }
- }
另外在这里感谢波波和《算法导论》,还有China8848的报告。