SP15650 ULM09 - Dark roads
题意
给定若干个 个点 条边的无向图,求出所有边权减去最小生成树的结果。
多组数据,以 结尾,每组数据先输入 ,接着输入 行,每行 个整数 ,表示 到 有一条边权为 的无向边。
对于每一组测试输出对应答案。
解法
最小生成树板子,使用 Kruskal 或者 Prim 求解即可。这里使用的是 Kruskal。
代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
#define int long long
const int N = 1e7 + 5;
struct Node
{
int u, v, w;
bool operator <(const Node& t)const
{
return w < t.w;
}
};
Node a[N];
int p[N], n, m, sum = 0;
int find(int x)
{
if (p[x] == x) return x;
return p[x] = find(p[x]);
}
void join(int a, int b)
{
p[find(a)] = find(b);
}
void kruskal()
{
sort(a + 1, a + m + 1);
for (int i = 1; i <= n; i++) p[i] = i;
int cnt = 0, ans = 0;
for (int i = 1; i <= m && cnt < n - 1; i++)
{
if (find(a[i].u) == find(a[i].v)) continue;
join(a[i].u, a[i].v);
cnt++;
ans += a[i].w;
}
printf("%lld\n", sum - ans);
}
signed main()
{
while (scanf("%lld %lld", &n, &m))
{
if (n == 0 && m == 0) break;
sum = 0;
for (int i = 1; i <= m; i++)
{
scanf("%lld %lld %lld", &a[i].u, &a[i].v, &a[i].w);
sum += a[i].w;
}
kruskal();
}
return 0;
}

浙公网安备 33010602011771号