BOJ 11779
์ต์๋น์ฉ ๊ตฌํ๊ธฐ 2 ์ฑ๊ณต์คํ์ ์ ์ง
1 ์ด 256 MB 18841 6855 4782 36.407% ๋ฌธ์
n(1≤n≤1,000)๊ฐ์ ๋์๊ฐ ์๋ค. ๊ทธ๋ฆฌ๊ณ ํ ๋์์์ ์ถ๋ฐํ์ฌ ๋ค๋ฅธ ๋์์ ๋์ฐฉํ๋ m(1≤m≤100,000)๊ฐ์ ๋ฒ์ค๊ฐ ์๋ค. ์ฐ๋ฆฌ๋ A๋ฒ์งธ ๋์์์ B๋ฒ์งธ ๋์๊น์ง ๊ฐ๋๋ฐ ๋๋ ๋ฒ์ค ๋น์ฉ์ ์ต์ํ ์ํค๋ ค๊ณ ํ๋ค. ๊ทธ๋ฌ๋ฉด A๋ฒ์งธ ๋์์์ B๋ฒ์งธ ๋์ ๊น์ง ๊ฐ๋๋ฐ ๋๋ ์ต์๋น์ฉ๊ณผ ๊ฒฝ๋ก๋ฅผ ์ถ๋ ฅํ์ฌ๋ผ. ํญ์ ์์์ ์์ ๋์ฐฉ์ ์ผ๋ก์ ๊ฒฝ๋ก๊ฐ ์กด์ฌํ๋ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ๋์์ ๊ฐ์ n(1≤n≤1,000)์ด ์ฃผ์ด์ง๊ณ ๋์งธ ์ค์๋ ๋ฒ์ค์ ๊ฐ์ m(1≤m≤100,000)์ด ์ฃผ์ด์ง๋ค. ๊ทธ๋ฆฌ๊ณ ์ ์งธ ์ค๋ถํฐ m+2์ค๊น์ง ๋ค์๊ณผ ๊ฐ์ ๋ฒ์ค์ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋ค. ๋จผ์ ์ฒ์์๋ ๊ทธ ๋ฒ์ค์ ์ถ๋ฐ ๋์์ ๋ฒํธ๊ฐ ์ฃผ์ด์ง๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ๋ค์์๋ ๋์ฐฉ์ง์ ๋์ ๋ฒํธ๊ฐ ์ฃผ์ด์ง๊ณ ๋ ๊ทธ ๋ฒ์ค ๋น์ฉ์ด ์ฃผ์ด์ง๋ค. ๋ฒ์ค ๋น์ฉ์ 0๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ , 100,000๋ณด๋ค ์์ ์ ์์ด๋ค.
๊ทธ๋ฆฌ๊ณ m+3์งธ ์ค์๋ ์ฐ๋ฆฌ๊ฐ ๊ตฌํ๊ณ ์ ํ๋ ๊ตฌ๊ฐ ์ถ๋ฐ์ ์ ๋์๋ฒํธ์ ๋์ฐฉ์ ์ ๋์๋ฒํธ๊ฐ ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ์ถ๋ฐ ๋์์์ ๋์ฐฉ ๋์๊น์ง ๊ฐ๋๋ฐ ๋๋ ์ต์ ๋น์ฉ์ ์ถ๋ ฅํ๋ค.
๋์งธ ์ค์๋ ๊ทธ๋ฌํ ์ต์ ๋น์ฉ์ ๊ฐ๋ ๊ฒฝ๋ก์ ํฌํจ๋์ด์๋ ๋์์ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค. ์ถ๋ฐ ๋์์ ๋์ฐฉ ๋์๋ ํฌํจํ๋ค.
์ ์งธ ์ค์๋ ์ต์ ๋น์ฉ์ ๊ฐ๋ ๊ฒฝ๋ก๋ฅผ ๋ฐฉ๋ฌธํ๋ ๋์ ์์๋๋ก ์ถ๋ ฅํ๋ค.
์์ ์ ๋ ฅ 1 ๋ณต์ฌ
5 8 1 2 2 1 3 3 1 4 1 1 5 10 2 4 2 3 4 1 3 5 1 4 5 3 1 5
์์ ์ถ๋ ฅ 1 ๋ณต์ฌ
4 3 1 3 5โ
๋ค์ต์คํธ๋ผ๋ฅผ ์ ์ฉํ๋ ๋ฌธ์ ์์ ํ ์ธต ๋์๊ฐ ๊ฒฝ๋ก๋ฅผ ์ฐ์ด์ผ ํ๋ ๋ฌธ์ ์ด๋ค.
๊ฒฝ๋ก ์ฐ๋๊ฑฐ ๋๋ฌธ์ ์๊ฐ๋ณด๋ค ์ด๋ ค์ ๋ค.
๊ฒฝ๋ก๋ intํ ๋ฐฐ์ด์ ํ๋ ๋ง๋ค์ด์ฃผ์ด, ๋ค์ต์คํธ๋ผ๋ก ๋ค์ ๋ ธ๋์ ๋น์ฉ์ ์ ์ฅํด์ค๋ ๊ฒฝ๋ก[๋ค์๋ ธ๋] = ํ์ฌ๋ ธ๋ ๋ฅผ ํด์ฃผ๋ฉด ๋๋ค.
์ด์ฒํผ ๋ค์ต์คํธ๋ผ๋ ์ ํด์ง ์ถ๋ฐ์ ๋ถํฐ ์์๋๋ก ๊ฐ๊ธฐ๋๋ฌธ์, ์ด๋ ๊ฒ๋ง ์ฐ์ด์ค๋ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ ์ ์๋ค.
์ด๋ ๊ฒ ๊ฐ๋จํ๊ฑธ ์ ์ ๋จน์๋์ง ๋ชจ๋ฅด๊ฒ ๋ค.
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#define INF 987654321
using namespace std;
int N, M, A, B;
vector<vector<pair<int,int>>>graph(1001);
int main(){
cin>>N>>M;
for(int i=0; i<M; i++){
int st, dest, cost;
cin>>st>>dest>>cost;
graph[st].push_back({cost,dest});
}
cin>>A>>B;
for(int i=1; i<=N; i++)
sort(graph[i].begin(), graph[i].end());
vector<int>dist(1001, INF);
int visit[1001] = {0};
dist[A] = 0;
priority_queue<pair<int,int>, vector<pair<int,int>>, greater<>>pq;
pq.push({0, A});
while(!pq.empty()){
int cur_node = pq.top().second;
int cur_dist = pq.top().first;
pq.pop();
for(auto edge : graph[cur_node]){
int nxt_node = edge.second;
int nxt_dist = edge.first + cur_dist;
if(nxt_dist < dist[nxt_node]){
visit[nxt_node] = cur_node;
dist[nxt_node] = nxt_dist;
pq.push({nxt_dist, nxt_node});
}
}
}
vector<int>v;
int t = B;
while(t){
v.push_back(t);
t = visit[t];
}
cout<<dist[B]<<'\n'<<v.size()<<'\n';
while(!v.empty()){
cout<<v.back()<<' ';
v.pop_back();
}
}