最小生成树之Kruskal算法
代码如下:
#include <bits/stdc++.h>
#define maxn 100010 // 最大顶点数
#define maxm 1000010 // 最大边数
using namespace std;
int n, m, u[maxm], v[maxm], w[maxm], p[maxn], r[maxm];
int cmp( const int i, const int j){
return w[i] < w[j];
}
int find( int x){
return p[x] == x ? x : p[x] = find( p[x]);
}
int Kruskal()
{
int ans = 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){
ans += w[e];
p[x] = y;
}
}
return ans;
}
int main()
{
int t, x;
scanf( "%d%d", &n, &m);
for ( int i = 0; i < m; i++){
scanf( "%d%d%d", &u[i], &v[i], &w[i]);
}
printf( "%d\n", Kruskal());
return 0;
}