์ต๋จ๊ฒฝ๋ก ์ฑ๊ณต
1 ์ด 256 MB 141443 40780 20216 24.508% ๋ฌธ์
๋ฐฉํฅ๊ทธ๋ํ๊ฐ ์ฃผ์ด์ง๋ฉด ์ฃผ์ด์ง ์์์ ์์ ๋ค๋ฅธ ๋ชจ๋ ์ ์ ์ผ๋ก์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค. ๋จ, ๋ชจ๋ ๊ฐ์ ์ ๊ฐ์ค์น๋ 10 ์ดํ์ ์์ฐ์์ด๋ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ์ ์ ์ ๊ฐ์ V์ ๊ฐ์ ์ ๊ฐ์ E๊ฐ ์ฃผ์ด์ง๋ค. (1 ≤ V ≤ 20,000, 1 ≤ E ≤ 300,000) ๋ชจ๋ ์ ์ ์๋ 1๋ถํฐ V๊น์ง ๋ฒํธ๊ฐ ๋งค๊ฒจ์ ธ ์๋ค๊ณ ๊ฐ์ ํ๋ค. ๋์งธ ์ค์๋ ์์ ์ ์ ์ ๋ฒํธ K(1 ≤ K ≤ V)๊ฐ ์ฃผ์ด์ง๋ค. ์ ์งธ ์ค๋ถํฐ E๊ฐ์ ์ค์ ๊ฑธ์ณ ๊ฐ ๊ฐ์ ์ ๋ํ๋ด๋ ์ธ ๊ฐ์ ์ ์ (u, v, w)๊ฐ ์์๋๋ก ์ฃผ์ด์ง๋ค. ์ด๋ u์์ v๋ก ๊ฐ๋ ๊ฐ์ค์น w์ธ ๊ฐ์ ์ด ์กด์ฌํ๋ค๋ ๋ป์ด๋ค. u์ v๋ ์๋ก ๋ค๋ฅด๋ฉฐ w๋ 10 ์ดํ์ ์์ฐ์์ด๋ค. ์๋ก ๋ค๋ฅธ ๋ ์ ์ ์ฌ์ด์ ์ฌ๋ฌ ๊ฐ์ ๊ฐ์ ์ด ์กด์ฌํ ์๋ ์์์ ์ ์ํ๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค๋ถํฐ V๊ฐ์ ์ค์ ๊ฑธ์ณ, i๋ฒ์งธ ์ค์ i๋ฒ ์ ์ ์ผ๋ก์ ์ต๋จ ๊ฒฝ๋ก์ ๊ฒฝ๋ก๊ฐ์ ์ถ๋ ฅํ๋ค. ์์์ ์์ ์ 0์ผ๋ก ์ถ๋ ฅํ๊ณ , ๊ฒฝ๋ก๊ฐ ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ์๋ INF๋ฅผ ์ถ๋ ฅํ๋ฉด ๋๋ค.
์์ ์ ๋ ฅ 1 ๋ณต์ฌ
5 6 1 5 1 1 1 2 2 1 3 3 2 3 4 2 4 5 3 4 6
์์ ์ถ๋ ฅ 1 ๋ณต์ฌ
0 2 3 7 INF
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํ๋ฉด ํ๋ฆฌ๋ ๋ฌธ์ ์ด๋ค.
https://m.blog.naver.com/ndb796/221234424646
23. ๋ค์ต์คํธ๋ผ(Dijkstra) ์๊ณ ๋ฆฌ์ฆ
๋ค์ต์คํธ๋ผ(Dijkstra) ์๊ณ ๋ฆฌ์ฆ์ ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ ํ์ฉํ ๋ํ์ ์ธ ์ต๋จ ๊ฒฝ๋ก(Shortest Path) ํ...
blog.naver.com
ํด๋นํฌ์คํธ๋ฅผ ์ฐธ๊ณ ํ์๋ค.
DP์ ๊ธฐ๋ณธ์ ์ธ ์ฌ์ฉ์ผ๋ก ๋ ธ๋๊ฐ์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ฉด ๋๋ค.
๊ฑฐ๋ฆฌ์ -๋ฅผ ๋ถ์ฌ ์ต์ํ์ผ๋ก ๋ง๋๋ ๋ฐฉ๋ฒ๋ณด๋ค๋ ์ฒ์์ด๋ ์ง๊ด์ ์ผ๋ก pq๋ฅผ greater<>๋ฅผ ์จ ์ต์ํ์ผ๋ก ์ ์ํ์๋ค.
์ธ์ ๋ฆฌ์คํธ์ pq๋ฅผ ์ฌ์ฉํด NlogE์ ์๊ฐ์ด ๊ฑธ๋ฆฌ๊ฒ ํ์๋ค.
#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
#define INF 987654321
using namespace std;
int N, E, K;
vector<vector<pair<int,int>>>graph(20001);
int main(){
cin>>N>>E>>K;
for(int i=0; i<E; i++){
int u, v, w;
cin>>u>>v>>w;
graph[u].push_back({v,w});
}
vector<int>dist(N+1, INF);
priority_queue<pair<int,int>, vector<pair<int,int>>, greater<>> pq;
dist[K] = 0;
pq.push({0, K});
while(!pq.empty()){
int cur_dist = pq.top().first;
int cur_node = pq.top().second;
pq.pop();
for(int i=0; i<graph[cur_node].size(); i++){
int nxt_node = graph[cur_node][i].first;
int nxt_dist = cur_dist + graph[cur_node][i].second;
if(nxt_dist < dist[nxt_node]){
dist[nxt_node] = nxt_dist;
pq.push({nxt_dist, nxt_node});
}
}
}
for(int i=1; i<=N; i++){
if(dist[i] == INF) cout<<"INF"<<'\n';
else cout<<dist[i]<<'\n';
}
}