結果
| 問題 |
No.160 最短経路のうち辞書順最小
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2016-07-21 17:11:35 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 15 ms / 5,000 ms |
| コード長 | 1,790 bytes |
| コンパイル時間 | 1,359 ms |
| コンパイル使用メモリ | 92,048 KB |
| 実行使用メモリ | 6,824 KB |
| 最終ジャッジ日時 | 2024-11-06 02:48:22 |
| 合計ジャッジ時間 | 2,461 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 26 |
ソースコード
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <utility>
#include <queue>
#include <list>
using namespace std;
const int INF = 1e7;
typedef pair<int, int> PII;
vector<vector<int>> dist_matrix;
vector<vector<int>> connect;
vector<int> distances;
void dijkstra(int start) {
int n = dist_matrix.size();
distances.assign(n, INF);
distances[start] = 0;
priority_queue<PII, vector<PII>, greater<PII>> que;
que.push(make_pair(0, start));
while (!que.empty()) {
auto p = que.top();
int now_dist = p.first;
int from = p.second;
que.pop();
if (now_dist > distances[from]) {
continue;
}
for (auto to : connect[from]) {
int d = now_dist + dist_matrix[from][to];
if (d < distances[to]) {
distances[to] = d;
que.push(make_pair(d, to));
}
}
}
}
bool dfs(list<int> &route, int start) {
int now = route.back();
for (auto from : connect[now]) {
if (distances[from] + dist_matrix[from][now] == distances[now]) {
route.emplace_back(from);
if (from == start) {
return true;
}
if (dfs(route, start)) {
return true;
}
route.pop_back();
}
}
return false;
}
int main() {
int n, m, s, g, a, b, c;
cin >> n >> m >> s >> g;
dist_matrix.assign(n, vector<int>(n, INF));
connect.assign(n, vector<int>());
for (int i = 0; i < m; i++) {
cin >> a >> b >> c;
dist_matrix[a][b] = c;
dist_matrix[b][a] = c;
connect[a].emplace_back(b);
connect[b].emplace_back(a);
}
for (auto &v : connect) {
sort(v.begin(), v.end());
}
// goalからダイクストラして、startから辞書順に経路復元を試す
dijkstra(g);
list<int> route = {s};
dfs(route, g);
for (auto x : route) {
cout << x;
if (x != g) {
cout << " ";
} else {
cout << endl;
}
}
return 0;
}