旅行

B-旅行

https://ac.nowcoder.com/acm/problem/14550

spfa+链式前向星存图

题目大意

首先要明确,不管题目给了多少个城市,题目只需要求三个点之间的最大距离的最短路径,所以我们依次枚举每个中点,让每个点都做一次中点,并跑一次spfa,求出最短路径,然后再求最短路径的最大值就行

细节处理

就是在跑完spfa之后,此时的最短路已经形成,我们所要做的就是求当前节点路径的最大值,并返回,如果没有那就返回-1,在for循环中,如果有多个if那么只要满足if条件里面的语句,那么就执行if语句(除非遇到continue,或者break跳出循环),如果是if...else那么直需要执行其中一条满足的语句就会跳出循环不会执行后面的语句

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e3 + 10;
const int inf = 0x3f3f3f3f;
int head[maxn], cnt, dis[maxn], vis[maxn], n, m;
queue<int> q;
struct node
{
    int to, cost, next;
} w[maxn << 1];

void add(int a, int b, int c) //链式前向星存图
{
    w[++cnt].to = b;
    w[cnt].cost = c;
    w[cnt].next = head[a];
    head[a] = cnt;
}
int spfa(int x)
{
    memset(dis, inf, sizeof(dis));
    memset(vis, 0, sizeof(vis));
    dis[x] = 0; //标记起点
    vis[x] = 1;
    q.push(x);
    while (!q.empty())
    {
        int v = q.front();
        q.pop();
        vis[v] = 0;
        for (int i = head[v]; ~i; i = w[i].next) //依次遍历该节点的邻接点
        {
            node e = w[i];
            if (dis[e.to] > e.cost + dis[v]) //松弛操作
            {
                dis[e.to] = e.cost + dis[v];
                if (!vis[e.to]) //如果该结点没有被访问过就加入该节点
                {
                    q.push(e.to);
                    vis[e.to] = 1; //标记这个点
                }
            }
        }
    }
    int ma1 = -1, ma2 = -1;
    dis[x] = -3;
    for (int i = 1; i <= n; ++i) //遍历找出最大的和第二大的边——求和
    {
        if (dis[i] == inf)
            continue;
        if (dis[i] > ma1)
            ma2 = ma1, ma1 = dis[i];
        else if (dis[i] > ma2)
            ma2 = dis[i];
    }
    if (ma1 != -1 && ma2 != -1)
        return ma1 + ma2;
    return -1;
}
int main()
{
    int t;
    scanf("%d", &t);
    while (t--)
    {
        cnt = 0;
        memset(head, -1, sizeof(head));
        scanf("%d%d", &n, &m);
        for (int i = 1; i <= m; ++i)
        {
            int a, b, c;
            scanf("%d%d%d", &a, &b, &c);
            add(a, b, c); //无向图加边两次
            add(b, a, c);
        }
        int ans = -1;
        for (int i = 1; i <= n; ++i)
            ans = max(ans, spfa(i));
        printf("%d\n", ans);
    }
    return 0;
}
牛客课后习题题解 文章被收录于专栏

等待蜕变

全部评论

相关推荐

2024-12-06 16:58
西北工业大学 Java
给份工作好不好:是“已结束”了然后又被捞出来了吗
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
昨天 11:44
你在各大软件投了一份又一份,你打招呼的hr一个接一个,但是只要你投过的,很快就下线了,没关系你的能量是很强,你看过的岗位招到人的速度都增加了。朋友们一个个拿着丰厚的实习回报,你却默默在家刷新邮箱,等待着那寥寥无几的面试通知。你每天一睁眼就狂投简历,你一有面试邀约就点确认。过年亲戚们围坐聊天,谈论着他们孩子的职场成就,你试图插话说自己面试过的公司数量,但他们显然不太感兴趣。你在心里自嘲,觉得他们不懂面试的艰辛、不懂得每一次面试机会的珍贵,不懂得一张张精心准备的简历背后的努力。笑你那个小侄子只会在网上刷刷职位,而你已经是各大招聘网站的常客。亲戚们夸赞自己孩子一年的成就,儿子的新工作,女儿的晋升,而...
龚新化:这帖删了呗,这跟我朋友有点相似,不过我是无所谓的😀,没什么感觉,我不轻易破防的,但是我一个朋友可能有点汗流浃背了😕,他不太舒服想睡了,当然不是我哈,我一直都是行的,以一个旁观者的心态看吧,也不至于破防吧😃,就是想照顾下我朋友的感受,他有点破防了,还是建议删了吧😯,当然删不删随你,因为我是没感觉的,就是为朋友感到不平罢了🥺
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务