From 3119975208e679e1719d08ce71503e40a397365c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A0=95=EC=9C=A0=ED=99=98?= Date: Sat, 11 Oct 2025 11:16:22 +0900 Subject: [PATCH] =?UTF-8?q?22870=EB=B2=88=20=ED=92=80=EC=9D=B4=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 0x1D/solutions/22870.cpp | 61 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 57 insertions(+), 4 deletions(-) diff --git a/0x1D/solutions/22870.cpp b/0x1D/solutions/22870.cpp index 6c991660..a5068a32 100644 --- a/0x1D/solutions/22870.cpp +++ b/0x1D/solutions/22870.cpp @@ -1,11 +1,64 @@ -// Authored by : BaaaaaaaaaaarkingDog +// Authored by : uhwan0723 // Co-authored by : - -// http://boj.kr/**************** +// http://boj.kr/781f212c4748490487a3071dad460e4f #include using namespace std; +const int mn = 2e5+5, md = 2e9; +int n, m, s, e, d[mn]; +bool pass[mn]; +vector> adj[mn]; +priority_queue> pq; + +int dijk(int st, int en){ + fill(d, d+n+1, md); + d[st] = 0; + pq.push({0, st}); + while(!pq.empty()){ + auto cur = pq.top(); pq.pop(); + int w = -cur.first, u = cur.second; + if(w != d[u]) continue; + for(auto nxt : adj[u]){ + int v = nxt.first, nw = nxt.second; + if(d[v] <= nw+w || pass[v]) continue; + d[v] = nw+w; + pq.push({-d[v], v}); + } + } + return d[en]; +} + int main(void){ ios::sync_with_stdio(0); cin.tie(0); - -} \ No newline at end of file + cin >> n >> m; + while(m--){ + int u, v, w; + cin >> u >> v >> w; + adj[u].push_back({v, w}); + adj[v].push_back({u, w}); + } + cin >> s >> e; + int d1 = dijk(e, s); + int cur = s, dist = 0; + while(cur != e){ + sort(adj[cur].begin(), adj[cur].end()); + for(auto nxt : adj[cur]){ + int v = nxt.first, w = nxt.second; + if(dist + w + d[v] != d1) continue; + dist += w; + cur = v; + if(cur != e) pass[cur] = true; + break; + } + } + int d2 = dijk(e, s); + cout << d1+d2; +} + +/* +첫 번째 다익스트라를 e에서 s로 돌리면, 각 정점들에서 e까지의 거리가 d에 저장됩니다. +s에서부터 시작하는 cur은 사전순으로 가장 앞서는 경로에 있는 다음 정점을 찾기 위해, +s에서 cur까지의 거리 + cur에서 nxt로의 가중치 + nxt에서 e까지의 거리 == 최단거리 +를 만족하는 가장 낮은 번호의 정점을 선택합니다. +*/