const int MAXN = 10000;
struct edge { //边
int u, v; //两个端点
int cast; //边权
} E[MAXN];
int father[N];
int findFather(int x) {
int a = x;
while(x != father[x]) {
x = father[x];
}
while(a != father[a]) {
int z = a;
a = father[a];
father[z] = x;
}
return x;
}
bool cmp(edge a, edge b) {
return a.cost < b.cast;
}
int kruskal(int n, int m) {
int ans = 0, Num_Edge = 0;
//初始化并查集
for(int i=1; i<=n; i++) {
father[i] = i;
}
sort(E, E+m, cmp);
for(int i=0; i<m; i++) {
int faU = findFather(E[i].u);
int faV = findFather(E[i].v);
if(faU != faV) {
father[faU] = faV;
ans += E[i].cast;
Num_Edge++;
if(Num_Edge == n - 1) break;
}
}
if(Num_Edge != n - 1) return -1;
else return ans;
}
Kruskal
最新推荐文章于 2023-02-07 09:31:37 发布