目标算法:Kruskal算法
应用范围:MST
算法代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cstdlib>
using namespace std;
const int maxn = 10005;
int set[maxn];
int n,m;
struct Edge
{
int a,b;
int dis;
}Ed[50005]; //定义边集
int cmp(const void *a,const void *b)
{
struct Edge *c,*d;
c = (struct Edge*)a;
d = (struct Edge*)b;
return c->dis - d->dis;
} //快排cmp
int find(int x)
{
int k,j,r;
r = x;
while(r != set[r])
r = set[r];
k = x;
while(k != r)
{
j = set[k];
set[k] = r;
k = j;
}
return r;
} //并查集查找 + 路径压缩
void merge(int x,int y)
{
set[y] = x;
} //并查集合并
void init()
{
for(int i=1;i<=n;i++)
set[i] = i;
} //并查集初始化;
int Kruskal()
{
int ans = 0;
int cnt = 0;
qsort(Ed,m,sizeof(Ed[0]),cmp);
for(int i=0;i<m;i++)
{
int f1 = find(Ed[i].a);
int f2 = find(Ed[i].b);
if(f1 == f2) continue;
else
{
cnt++;
ans += Ed[i].dis;
merge(f1,f2);
}
if(cnt == n-1)
return ans;
}
return -1; //无法生成MST
} //Kru算法
int main()
{
while(~scanf("%d%d",&n,&m))
{
init();
for(int i=0;i<m;i++)
scanf("%d%d%d",&Ed[i].a,&Ed[i].b,&Ed[i].dis);
int ans = Kruskal();
printf("%d\n",ans);
}
return 0;
}