【最小生成树】路线规划

战争尾声

https://ac.nowcoder.com/acm/contest/11038/A

路线规划

nowcoder 217603

题目大意

给一个无向连通图,问你在经过的边最少的前提下,从1走过所有点,再走回1的最短距离

解题思路

对于求出来的路线中,设从1到最后一个点的路径为干线(如图下图,最后一个点为5,干线为1-2-3-5)
对于干线上的边(如2-3),来回各会走两遍
而对于非干线上的边,在去的时候,要离开干线,再回到干线,共两遍
而回来的时候不用走
所以无论是干线上的边还是非干线上的边,都会走两遍
那么对该图做最小生成树,使得所有点都到过一遍,然后乘2即可

代码

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
ll n, m, x, y, num, ans, fa[200021];
struct node
{
    ll x, y, l;
}a[2000021];
bool cmp(node a, node b)
{
    return a.l < b.l;
}
ll find(ll x)
{
    return x == fa[x]?x:fa[x] = find(fa[x]);
}
int main()
{
    scanf("%lld%lld", &n, &m);
    for (ll i = 1; i <= m; ++i)
        scanf("%lld%lld%lld", &a[i].x, &a[i].y, &a[i].l);
    sort(a + 1, a + 1 + m, cmp);
    for (ll i = 1; i <= n; ++i)
        fa[i] = i;
    num = 1;
    for (ll i = 1; i <= m; ++i)//最小生成树
    {
        x = find(a[i].x);
        y = find(a[i].y);
        if (x != y)
        {
            num++;
            ans += a[i].l;//记录边权
            fa[x] = y;
            if (num == n) break;//这里要用num记录一下,如果所有点都到过了,就直接退出,以减少时间,不然会T
        }
    }
    printf("%lld", ans * 2);
    return 0;
}
全部评论

相关推荐

小红书 后端开发 总包n+8w+期权
点赞 评论 收藏
分享
无敌虾孝子:喜欢爸爸还是喜欢妈妈
点赞 评论 收藏
分享
最近又搬回宿舍了,在工位坐不住,写一写秋招起伏不断的心态变化,也算对自己心态的一些思考表演式学习从开始为实习准备的时候就特别焦虑,楼主一开始选择的是cpp后端,但是24届这个方向已经炸了,同时自己又因为本科非92且非科班,所以感到机会更加迷茫。在某天晚上用java写出hello&nbsp;world并失眠一整晚后选择老本行干嵌入式。理想是美好的,现实情况是每天忙但又没有实质性进展,总是在配环境,调工具,顺带还要推科研。而这时候才发现自己一直在表演式学习,徘徊在设想如何展开工作的循环里,导致没有实质性进展。现在看来当时如果把精力专注在动手写而不是两只手端着看教程,基本功或许不会那么差。实习的焦虑5月,楼主...
耶比:哲学上有一个问题,玛丽的房间:玛丽知道眼睛识别色彩的原理知道各种颜色,但是她生活在黑白的房间里,直到有一天玛丽的房门打开了她亲眼看到了颜色,才知道什么是色彩。我现在最大可能的减少对非工作事情的思考,如果有一件事困扰了我, 能解决的我就直接做(去哪里或者和谁吵架等等……),解决不了的我就不想了,每一天都是最年轻的一天,珍惜今天吧
投递比亚迪等公司10个岗位 > 秋招被确诊为…… 牛客创作赏金赛
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务