結果
問題 | No.614 壊れたキャンパス |
ユーザー | srup٩(๑`н´๑)۶ |
提出日時 | 2017-12-14 13:11:29 |
言語 | C++11 (gcc 11.4.0) |
結果 |
RE
|
実行時間 | - |
コード長 | 2,732 bytes |
コンパイル時間 | 1,776 ms |
コンパイル使用メモリ | 185,544 KB |
実行使用メモリ | 47,712 KB |
最終ジャッジ日時 | 2024-12-14 12:38:15 |
合計ジャッジ時間 | 15,550 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 8 ms
19,740 KB |
testcase_01 | AC | 8 ms
19,484 KB |
testcase_02 | AC | 8 ms
19,540 KB |
testcase_03 | AC | 7 ms
19,532 KB |
testcase_04 | AC | 8 ms
20,044 KB |
testcase_05 | AC | 8 ms
19,556 KB |
testcase_06 | AC | 8 ms
19,928 KB |
testcase_07 | AC | 8 ms
20,324 KB |
testcase_08 | RE | - |
testcase_09 | RE | - |
testcase_10 | RE | - |
testcase_11 | RE | - |
testcase_12 | RE | - |
testcase_13 | RE | - |
testcase_14 | RE | - |
testcase_15 | RE | - |
testcase_16 | RE | - |
testcase_17 | RE | - |
testcase_18 | RE | - |
testcase_19 | RE | - |
ソースコード
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef vector<int> vint; typedef pair<int,int> pint; typedef vector<pint> vpint; #define rep(i,n) for(int i=0;i<(n);i++) #define REP(i,n) for(int i=n-1;i>=(0);i--) #define reps(i,f,n) for(int i=(f);i<(n);i++) #define each(it,v) for(__typeof((v).begin()) it=(v).begin();it!=(v).end();it++) #define all(v) (v).begin(),(v).end() #define eall(v) unique(all(v), v.end()) #define pb push_back #define mp make_pair #define fi first #define se second #define chmax(a, b) a = (((a)<(b)) ? (b) : (a)) #define chmin(a, b) a = (((a)>(b)) ? (b) : (a)) const int MOD = 1e9 + 7; const int INF = 1e9; const ll INFF = 1e18; int N, M, K, S, T; int a[200010], b[200010], c[200010]; map<pair<int, int>, int> ma; const int MAX_N = 200010; using TYPE = ll; // 距離の型を入れる vector<pair<int, TYPE> > G[MAX_N]; vector<TYPE> dijkstra(int start){ vector<TYPE> dist(MAX_N, INFF); dist[start] = 0;//dist[i] := start->iまでの最短距離 priority_queue<pair<TYPE, int>, vector<pair<TYPE, int> >, greater<pair<TYPE, int> > > que; que.push(make_pair(0, start)); while(!que.empty()){ TYPE cost; int u;//今までにかかった時間 現在の頂点 cost = que.top().first, u = que.top().second; que.pop(); if(dist[u] < cost) continue; for (auto tmp : G[u]){ int v = tmp.first; TYPE time = tmp.second;//隣接する頂点 その頂点まで行く時間 if(dist[v] > dist[u] + time){//u->v dist[v] = dist[u] + time; que.push(make_pair(dist[v], v)); } } } return dist; } set<int> li[200010]; // li[i] := i練で使われる階 int main(void) { cin >> N >> M >> K >> S >> T; rep(i, M) cin >> a[i] >> b[i] >> c[i]; int cnt = 0; ma[mp(1, S)] = cnt++; ma[mp(N, T)] = cnt++; rep(i, M) { if(ma.count(mp(a[i], b[i])) == 0) ma[mp(a[i], b[i])] = cnt++; if(ma.count(mp(a[i] + 1, c[i])) == 0) ma[mp(a[i] + 1, c[i])] = cnt++; } // for(auto u : ma) printf("ma %d %d %d\n", u.fi.fi, u.fi.se, u.se); rep(i, M) { int u = ma[mp(a[i], b[i])], v = ma[mp(a[i] + 1, c[i])]; // printf("u %d v %d\n", u, v); G[u].pb(mp(v, 0)); } li[1].insert(S), li[N].insert(T); rep(i, M) { li[a[i]].insert(b[i]), li[a[i] + 1].insert(c[i]); } reps(i, 1, N + 1) { for(auto j : li[i])for(auto k : li[i]) { if(j == k) continue; // printf("j %d k %d\n", j, k); int u = ma[mp(i, j)], v = ma[mp(i, k)]; // printf("2 u %d v %d\n", u, v); G[u].pb(mp(v, abs(j - k))), G[v].pb(mp(u, abs(j - k))); } } /* rep(i, 3) for(auto u : G[i]) { printf("%d -> %d %lld\n", i, u.fi, u.se); } */ auto dist = dijkstra(ma[mp(1, S)]); ll ans = dist[ma[mp(N, T)]]; if(ans == INFF) printf("-1\n"); else printf("%lld\n", ans); return 0; }