SP15650 ULM09 - Dark roads

题意

给定若干个 nn 个点 mm 条边的无向图,求出所有边权减去最小生成树的结果。

多组数据,以 n=0,m=0n = 0, m = 0 结尾,每组数据先输入 n,mn, m,接着输入 mm 行,每行 33 个整数 u,v,wu, v, w,表示 uuvv 有一条边权为 ww 的无向边。

对于每一组测试输出对应答案。

解法

最小生成树板子,使用 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;
}
posted @   HappyBobb  阅读(5)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示