n个点,有n-1条边就可连通, 总花费最小要选择 花费小 且 不会使各点连环 的 n-1条边
快排对边长(费用)进行排序, merge函数中判断会不会成环, 边数达到n-1 break;
#include <stdio.h>
#include <stdlib.h>
int m, n, f[110];
struct node
{
int u, v, w;
}a[10010], key;
void qs(struct node a[],int l, int r)
{
int i = l, j = r;
key = a[l];
if(l >= r) return ;
while(i < j)
{
while(i < j && a[j].w >= key.w) j--;
a[i] = a[j];
while(i < j && a[i].w <= key.w) i++;
a[j] = a[i];
}
a[i] = key;
qs(a, l, i-1);
qs(a, i+1, r);
}
void init(int f[])
{
int i;
for(i = 1; i <= n; i++)
{
f[i] = i;
}
}
int getf(int u)
{
if(f[u] == u) return u;
f[u] = getf(f[u]);
return f[u];
}
int merge(int u, int v)
{
int x = getf(u), y = getf(v);
if(x != y)
{
f[y] = x;
return 0;
}
else return 1;
}
int main()
{
int i;
while(scanf("%d%d", &n, &m) != EOF)
{
init(f);
for(i = 0; i < m; i++)
{
scanf("%d%d%d", &a[i].u, &a[i].v, &a[i].w);
}
qs(a, 0, m-1);
int num = 0, cost = 0;
for(i = 0; i < m; i++)
{
if(num == n-1)
break;
if(merge(a[i].u, a[i].v) == 0)
{
num++;
cost += a[i].w;
}
}
printf("%d\n", cost);
}
return 0;
}
/***************************************************
User name: jk170536张璐
Result: Accepted
Take time: 16ms
Take Memory: 248KB
Submit time: 2018-08-21 19:50:03
****************************************************/