最小生成樹的另一個算法,需要用到sort排序,而且這個sort有點兒繞。而且需要檢測連通的話需要多一些操作。
const int maxn = 110;
const int maxm = 10010;
const int max_int = ~(1<<31);
const int min_int = (1<<31);
int p[maxn];
int u[maxm], v[maxm], w[maxm], r[maxm];
//[0,max_int]
int find(int x){return x == p[x] ? p[x] : p[x] = find(p[x]);}
bool cmp(int x, int y){return w[x] < w[y];}
int kruskal(int n, int m){
int cnt = 0;
for(int i = 0; i < n; ++i)p[i] = i;
for(int i = 0; i < m; ++i)r[i] = i;
sort(r, r+m, cmp);
for(int i = 0; i < m; ++i){
int e = r[i], x = find(u[e]), y = find(v[e]);
if(x != y){
cnt += w[e];
p[x] = y;
}
}
return cnt;
}