UVa11374 Airport Express(Dijkstra)

这篇具有很好参考价值的文章主要介绍了UVa11374 Airport Express(Dijkstra)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题意

给出经济路线以及商业路线,在给出起始点s,终止点e,在只能使用其中一个商业路线 的情况下输出最短路径

思路

如果选择商业路线为从u到v,则需要从s->u,u->v,v->e点的路径最短。使用Dijkstra计算出从s点到其它各点,以及从e点到其它各点的最短路径,然后遍历商业路线u,v,选取从s->u,u->v,v->e点中路线最短的文章来源地址https://www.toymoban.com/news/detail-691894.html

代码

#include <bits/stdc++.h>

using namespace std;

#define _for(i, a, b) for(int i = (a); i < (b); i++)
#define _rep(i, a, b) for (int i = (a); i <= (b); i++)

struct Edge
{
    int u, v, d;
};

struct HeapNode
{
    int u, d;

    bool operator<(const HeapNode& other) const
    {
        return d > other.d;
    }
};

template <int SZV, int INF>
struct Dijkstra
{
    int n;
    vector<Edge> edges;
    vector<int> graph[SZV];
    bool done[SZV];
    int d[SZV], p[SZV];

    void init(int n)
    {
        this->n = n;
        edges.clear();
        _for(i, 0, n) {
            graph[i].clear();
        }
    }

    void addEdge(int u, int v, int d)
    {
        graph[u].push_back(edges.size());
        edges.push_back({u, v, d});
    }

    void dijkstra(int s)
    {
        priority_queue<HeapNode> pq;
        fill_n(done, n, false);
        fill_n(d, n, INF);
        d[s] = 0;
        pq.push({s, 0});

        while (!pq.empty()) {
            HeapNode curNode = pq.top();
            pq.pop();

            int u = curNode.u;
            if (done[u]) {
                continue;
            }

            done[u] = true;
            _for(i, 0, graph[u].size()) {
                const auto& edge = edges[graph[u][i]];
                int v = edge.v;
                if (d[u] + edge.d < d[v]) {
                    d[v] = d[u] + edge.d;
                    p[v] = graph[u][i];
                    pq.push({v, d[v]});
                }
            }
        }
    }

    void getPath(int s, int e, deque<int>& path, bool rev = false)
    {
        int x = e;
        if (rev) {
            path.push_back(x);
        } else {
            path.push_front(x);
        }

        while (x != s) {
            x = edges[p[x]].u;
            if (rev) {
                path.push_back(x);
            } else {
                path.push_front(x);
            }
        }
    }
};


void fastio()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
}

const int MAXN = 500 + 4;
const int INF = 1e9;

int main()
{
    fastio();

    #ifndef ONLINE_JUDGE
        ifstream fin("f:\\OJ\\uva_in.txt");
        streambuf* back = cin.rdbuf(fin.rdbuf());
    #endif

    int N, S, E;
    int kase = 0;
    while (cin >> N >> S >> E) {
        if (kase++) {
            cout << endl;
        }

        Dijkstra<MAXN, INF> sd, ed;
        sd.init(N + 1); ed.init(N + 1);

        int M;
        cin >> M;
        _for(i, 0, M) {
            int X, Y, Z;
            cin >> X >> Y >> Z;
            sd.addEdge(X, Y, Z);
            sd.addEdge(Y, X, Z);
            ed.addEdge(X, Y, Z);
            ed.addEdge(Y, X, Z);
        }

        sd.dijkstra(S);
        ed.dijkstra(E);
        int cu = -1;
        int ans = INF;
        deque<int> path;
        if (sd.d[E] < ans) {
            ans = sd.d[E];
            sd.getPath(S, E, path);
        }

        auto update = [&](int u, int v, int d) {
            if (sd.d[u] < ans && ed.d[v] < ans && sd.d[u] + d + ed.d[v] < ans) {
                ans = sd.d[u] + d + ed.d[v];
                cu = u;
                path.clear();
                sd.getPath(S, u, path);
                ed.getPath(E, v, path, true);
            }
        };

        int K;
        cin >> K;
        _for(i, 0, K) {
            int u, v, d;
            cin >> u >> v >> d;
            update(u, v, d);
            update(v, u, d);
        }

        _for(i, 0, path.size()) {
            if (i) {
                cout << " ";
            }
            cout << path[i];

        }
        cout << endl;
        if (cu == -1) {
            cout << "Ticket Not Used" << endl;
        } else {
            cout << cu << endl;
        }
        cout << ans << endl;
    }

    #ifndef ONLINE_JUDGE
        cin.rdbuf(back);
    #endif

    return 0;
}

到了这里,关于UVa11374 Airport Express(Dijkstra)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【小笔记】从算法训练现象分析可能的参数设置问题-loss分析篇

    【学而不思则罔,思而不学则殆】 9.30 首先给出一个理想的训练loss收敛图片:loss平滑的下降,并逐渐收敛到0. 平滑说明学习率设置较合适,收敛到0说明模型在参数空间中收敛到一个很理想的区域。 训练现象: 本质原因: 算法收敛到参数空间中某个较高的“平坦区域”,而

    2024年02月07日
    浏览(33)
  • 【算法训练-模拟 一】模拟设计LRU缓存结构

    废话不多说,喊一句号子鼓励自己:程序员永不失业,程序员走向架构!本篇Blog的主题是LRU缓存结构设计,这类题目出现频率还是很高的,几乎所有大厂都常考。 当然面对这道题,首先要讲清楚LRU是干什么的 LRU(Least Recently Used)缓存结构是一种常见的缓存管理策略, 用于

    2024年02月10日
    浏览(53)
  • 【算法】单源最短路径算法——Dijkstra算法

    迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法。这是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始,采用 贪心算法 的策略, 每次遍历到始点距离最

    2024年02月05日
    浏览(46)
  • 图算法——求最短路径(Dijkstra算法)

            目录 一、什么是最短路径 二、迪杰斯特拉(Dijkstra)算法  三、应用Dijkstra算法 (1) Dijkstra算法函数分析         求图的最短路径在实际生活中有许多应用,比如说在你在一个景区的某个景点,参观完后,要怎么走最少的路程到你想参观的下个景点,这就利用到

    2023年04月15日
    浏览(40)
  • Dijkstra算法实现(java)

      Dijkstra(迪杰斯特拉)算法是求解单源最短路径的经典算法,其原理也是基于贪心策略的。   Dijkstra算法设置一个集合 S S S 记录已求得的最短路径的顶点,初始时把源点 v 0 v_{0} v 0 ​ 放入 S S S ,集合 S S S 每并入一个新顶点 v i v_{i} v i ​ ,都要修改源点 v 0 v_{0} v 0 ​

    2023年04月08日
    浏览(30)
  • Dijkstra算法详解

    迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959年提出的,因此又 叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是 有权图中最 短路径问题 。迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法的策略,每次遍 历到始点距离最近

    2024年03月20日
    浏览(46)
  • 最短路径(Dijkstra)算法

    目录 一、Dijkstra算法 二、核心思路 三、步骤 四、代码 迪杰斯特拉(Dijkstra)算法是由荷兰计算机科学家狄克斯特拉于1959年提出的。是寻找从一个顶点到其余各顶点的最短路径算法,可用来 解决最短路径问题 。

    2024年02月07日
    浏览(44)
  • 最短路径(Dijkstra算法)

    (1)最短路径: 非网图:两顶点之间经历边数最小的路径 网图:两顶点之间经历的 边上权值之和 最短的路 1.思路 设置一个集合S存放已经找到最短路径的顶点,并设置一个源点,dist[]数组中存放源点距离每个顶点的最短距离,path[]数组中存放的是最短路径,基本过程可以如

    2024年02月09日
    浏览(47)
  • Dijkstra(迪杰斯特拉)算法

    Dijkstra(迪杰斯特拉)算法的思想是广度优先搜索(BFS) 贪心策略。 是从一个顶点到其余各顶点的最短路径算法,节点边是不各自不同的权重,但都必须是正数 如果是负数,则需要 Bellman-Ford 算法 如果想求任意两点之间的距离,就需要用 Floyd 算法 求节点0 - 4 的最短路径 每次从

    2024年04月12日
    浏览(33)
  • Dijkstra算法

    Dijkstra是一位荷兰的计算机科学家和数学家,他被认为是计算机科学领域的先驱之一。他于1930年5月11日出生于荷兰的鹿特丹,于2002年8月6日去世于荷兰的努南。Dijkstra最为人们所熟知的是他在算法问题解决和编程语言方面的贡献。 Dijkstra最重要的贡献之一就是他开发了最短路

    2024年02月06日
    浏览(21)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包