用并查集查找根节点,包括三种方法:
1.朴素查找法:
int find(int x) { int r = x; while(father[r] != r) r = father[r]; return r; }
2.路径压缩(递归):
int find(int x) { if(father[x] != x)
/*
在回溯时压缩路径
使得搜索x的根节点时所经过的节点都指向根节点
*/ father[x] = find(father[x]); return father[x]; }
3.路径压缩(非递归):
int find(int x) { int i, j, r = x; while(father[r] != r) r = father[r]; // 先搜索到根节点,并记录 i = x; while(i != r) { j = father[i]; // j 暂存i的父节点 father[i] = r; // i 指向根节点 i = j; // i 移动到父节点 } return r; }