题意:修路工对小气的农民很不满,觉得让他花最大的代价修路,同时要让他看不出:1)各点相互到达,2)没有环
思路:Kruskal求最大生成树,不过要注意这里不一定能将各点连在一起
#include
#include
#include
using namespace std;
int n, m, fa[1010], ans;
int find(int x)
{
int temp = x;
while(fa[x] != x)
{
x = fa[x];
}
fa[temp] = x;
return x;
}
struct Edge
{
int len, u, v;
}edge[20010];
int cmp(const void *a, const void *b)
{
return (*(Edge *)b).len - (*(Edge *)a).len;
}
int Kruskal()
{
int num = 0, canfind = 0; //默认不能实现
ans = 0;
for(int i = 0; i < n; i++)
fa[i] = i;
qsort(edge, m, sizeof(edge[0]), cmp);
for(int i = 0; i < m; i++)
{
int x = find(edge[i].u), y = find(edge[i].v);
if(x != y)
{
ans += edge[i].len; num++; fa[x] = y;
if(num == n - 1) {canfind = 1; break;}
}
}
return canfind;
}
int main()
{
#ifdef LOCAL
freopen("data.in", "r", stdin);
#endif
int s, e, c;
while(scanf("%d%d", &n, &m) != EOF)
{
for(int i = 0; i < m; i++)
{
scanf("%d%d%d", &s, &e, &c);
edge[i].len = c;
edge[i].u = s; edge[i].v = e;
}
if(Kruskal())
{
printf("%d\n", ans);
}
else printf("-1\n");
}
return 0;
}