#include #include #include #include using namespace std; using i64 = long long; struct edge { int to; i64 cost; }; int main(void) { constexpr i64 inf = 987654321987654321LL; int n, m, k, s, t; scanf("%d%d%d%d%d", &n, &m, &k, &s, &t); --s, --t; int N = 0; // 頂点数 vector> mp(n); // 座標圧縮用データ。 mp[a][b] := a棟b階についた連番 vector> route(n); // route[a] := a棟からa+1棟へ廊下がある階のリスト vector> dat; // 入力で与えられる m 個の渡り廊下のリスト mp[0] [s] = N++; mp[n-1][t] = N++; route[0] .push_back(s); route[n-1].push_back(t); for(int i=0; i> G(N); for(int i=0; i cost(N, inf); vector seen(N, false); cost[mp[0][s]] = 0; priority_queue, vector>, greater>> pq; // コスト、点番号 pq.emplace(0, mp[0][s]); while(!pq.empty()) { i64 _; int v; tie(_, v) = pq.top(); pq.pop(); if(seen[v]) { continue; } seen[v] = true; for(edge e : G[v]) { if(cost[e.to] > cost[v] + e.cost) { cost[e.to] = cost[v] + e.cost; pq.emplace(cost[e.to], e.to); } } } i64 res = cost[mp[n-1][t]]; if(res == inf) { res = -1; } printf("%lld\n", res); return 0; }