結果
| 問題 |
No.160 最短経路のうち辞書順最小
|
| コンテスト | |
| ユーザー |
izryt(趣味)
|
| 提出日時 | 2017-01-30 10:28:34 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 15 ms / 5,000 ms |
| コード長 | 1,565 bytes |
| コンパイル時間 | 1,951 ms |
| コンパイル使用メモリ | 178,020 KB |
| 実行使用メモリ | 5,248 KB |
| 最終ジャッジ日時 | 2024-12-23 23:52:29 |
| 合計ジャッジ時間 | 3,086 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 26 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
#define rep(i,x) for(int i=0;i<x;++i)
#define rep1(i,x) for(int i=1;i<=x;++i)
#define rrep(i,x) for(int i=x-1;i>=0;--i)
#define rrep1(i,x) for(int i=x;i>=1;--i)
#define all(a) begin(a),end(a)
#define fst first
#define scd second
#define PB push_back
const int inf = 1e9;
const int mod = 1e9 + 7;
using pii=pair<int,short>;
using vpii=vector<pii>;
struct edge{short to;int cost;};
vector<edge> G[1005];
int N, M, s, g;
pair<int,short> pre[1005];
int d[1005];
signed main()
{
cin >> N >> M >> s >> g;
rep(i, M) {
short a, b; int c; cin >> a >> b >> c;
G[a].PB(edge{b, c});
G[b].PB(edge{a, c});
}
rep(i, N) {
pre[i] = pii(inf, N+4);
}
priority_queue<pii, vpii, greater<pii>> q;
q.push(pii(0, g));
fill_n(d, N+1, inf);
d[g] = 0;
while (q.size()) {
pii p = q.top(); q.pop();
short v = p.scd; int c = p.fst;
if (d[v] < c) continue;
for (edge &e : G[v]) {
if (d[e.to] > d[v] + e.cost) {
d[e.to] = d[v] + e.cost;
q.push(pii(d[e.to], e.to));
}
}
}
vector<int> ans;
short cur = s;
ans.PB(s);
while (cur != g) {
short to = N+4;
for (edge &e : G[cur]) {
if (d[e.to] == d[cur] - e.cost) {
to = min(to, e.to);
}
}
ans.PB(to);
cur = to;
}
rep(i, ans.size()) {
if (i) cout << ' ';
cout << ans[i];
}
cout<<endl;
}
izryt(趣味)