임의의 정점은 1번 정점으로 한다.
정점의 수 n, 간선의 수 m이 주어진다.
각 간선은, 출발 정점, 도착 정점, 비용을 입력으로 받는다.
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
struct Data { // array of array
int e, dis;
Data(int a, int b ){
e = a;
dis = b;
}
bool operator< (const Data &d) const {
return dis > d.dis;
}
};
int n, m;
vector<int> dist(21, 2147000000);
vector<Data> graph[21];
priority_queue<Data> pQ;
int main() {
freopen("input.txt", "rt", stdin);
cin >> n >> m;
for (int i=1; i<=m; i++) {
int a, b, c;
cin >> a >> b >> c;
graph[a].push_back(Data(b, c));
}
pQ.push(Data(1, 0)); // 임의의 시작점
dist[1] = 0;
while(!pQ.empty()) {
Data data = pQ.top();
int now = data.e;
int dis_sum = data.dis;
pQ.pop();
for(int i=0; i<graph[now].size(); i++) {
int next = graph[now][i].e;
int next_dis_sum = dis_sum + graph[now][i].dis;
if(dist[next] > next_dis_sum) { // relaxing
dist[next] = next_dis_sum;
pQ.push(Data(next, next_dis_sum));
}
}
}
for(int i=2; i<=n; i++) {
if(dist[i] != 2147000000) cout << i << " : "
<< dist[i] << '\n';
else cout << i <<" : can not reach\n";
}
return 0;
}
임의의 정점에서 시작한다고 가정한다.
해당 정점에서 최소의 간선비용을 찾아, 해당 도착 정점으로 이동할때 값이 더 작다면 간다.