并查集的作用:
判断两个子图是否连接
代码C++:
#include <iostream>
using namespace std;
const int N = 10;
const int E = 15;
bool isVetexConnect(int *a, int i, int j){
while(a[i] != i){
i = a[i];
}
while(a[j] != j){
j = a[j];
}
if(i != j){
a[i] = j;
for(int k = 1; k<N; k++){//路径压缩
if(a[k] == i){
a[k] = j;
}
}
return true;
}
return false;
}
struct edge{
int x;
int y;
int length;
};
int main(){
string s = "0abcdefghi";
int a[N];
for(int i=0; i<N; i++){
a[i] = i;
}
edge e[E];
e[0] = {0,0,0};
e[1] = {8,7,1};
e[2] = {7,6,2};
e[3] = {3,9,2};
e[4] = {1,2,4};
e[5] = {3,6,4};
e[6] = {9,7,6};
e[7] = {8,9,7};
e[8] = {3,4,7};
e[9] = {2,3,8};
e[10] = {1,8,8};
e[11] = {4,5,9};
e[12] = {5,6,10};
e[13] = {2,8,11};
e[14] = {4,6,14};
for(int i=0; i<E; i++){
if(isVetexConnect(a, e[i].x, e[i].y)){
cout << i << ": " << s[e[i].x] << "->" << s[e[i].y] << "=" << e[i].length <<endl;
}else{
cout << i << ": " << s[e[i].x] << "<-" << s[e[i].y] << "=" << e[i].length <<endl;
}
for(int i=0; i<N; i++){
cout << a[i] << " ";
} cout <<endl;
}
return 0;
}