Skip to content

Latest commit

 

History

History
81 lines (70 loc) · 2.37 KB

1030. Travel Plan.md

File metadata and controls

81 lines (70 loc) · 2.37 KB

pat 甲级 1030. Travel Plan

题意概述

给出城市之间的距离以及城市之间每条公路的成本。你需要找到出发城市和目的地之间的最短路径。如果这样的最短路径不是唯一的,则应该以最低的成本输出该路径,这保证是唯一的。

输入输出格式

输入第一行包含 4 个正整数 N,M,S 和 D,分别表示城市数(城市从 0 到 N-1 编号)、公路数量、 起始城市和目标城市。接下来 M 行,每行以City1 City2 Distance Cost格式来描述一条公路。

在一行中打印沿起点到目的地的最短路径的城市,然后是路径的总距离和总成本。数字必须用空格分隔,并且输出末尾不得有多余的空格。

数据规模

$$N<=500$$

算法设计

题目比较简单,使用 Dijkstra 算法求出符合要求的最短路径,利用 DFS 输出该路径即可,具体实现可见代码

C++代码

#include <bits/stdc++.h>
using namespace std;
using gg = long long;
const gg MAX = 505;
using agg3 = array<gg, 3>;
struct Edge {
    gg to, dis, cost;
    Edge(gg t, gg d, gg c) : to(t), dis(d), cost(c) {}
};
vector<vector<Edge>> graph(MAX);
vector<gg> dis(MAX, INT_MAX), cost(MAX, INT_MAX), past(MAX, -1);
void Dijkstra(gg s) {
    priority_queue<agg3, vector<agg3>, greater<agg3>> pq;
    dis[s] = 0;
    cost[s] = 0;
    pq.push({0, 0, s});
    while (!pq.empty()) {
        auto p = pq.top();
        pq.pop();
        if (dis[p[2]] != p[0] or cost[p[2]] != p[1]) {
            continue;
        }
        for (auto& e : graph[p[2]]) {
            if (tie(dis[e.to], cost[e.to]) >
                make_tuple(p[0] + e.dis, p[1] + e.cost)) {
                dis[e.to] = p[0] + e.dis;
                cost[e.to] = p[1] + e.cost;
                past[e.to] = p[2];
                pq.push({dis[e.to], cost[e.to], e.to});
            }
        }
    }
}
void dfs(gg v) {
    if (past[v] == -1) {
        cout << v << " ";
        return;
    }
    dfs(past[v]);
    cout << v << " ";
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    gg ni, mi, si, di;
    cin >> ni >> mi >> si >> di;
    for (gg i = 0; i < mi; ++i) {
        gg a, b, c, d;
        cin >> a >> b >> c >> d;
        graph[a].push_back(Edge(b, c, d));
        graph[b].push_back(Edge(a, c, d));
    }
    Dijkstra(si);
    dfs(di);
    cout << dis[di] << " " << cost[di];
    return 0;
}