Doby's Lab

[알고리즘] 백준 14284번: 간선 이어가기 2 (C++) 본문

PS/BOJ

[알고리즘] 백준 14284번: 간선 이어가기 2 (C++)

도비(Doby) 2021. 12. 5. 01:53

https://www.acmicpc.net/problem/14284

 

14284번: 간선 이어가기 2

정점 n개, 0개의 간선으로 이루어진 무방향 그래프가 주어진다. 그리고 m개의 가중치 간선의 정보가 있는 간선리스트가 주어진다. 간선리스트에 있는 간선 하나씩 그래프에 추가해 나갈 것이다.

www.acmicpc.net

문제에서 하란대로 간선의 순서까지 조정하며 간선을 추가할 때마다 다익스트라를 돌려야 할 거 같지만 이는 헷갈리게 하려는 의도다.

그냥 다익스트라 한 번 돌리면 끝이다.

#include <iostream>
#include <utility>
#include <queue>
#include <vector>
#define MAX 5000 + 1
#define INF 987654321
#define pii pair<int, int>
using namespace std;

vector<pii> graph[MAX];
int n, m;

struct cmp {
	bool operator()(pii& a, pii& b) {
		return a.second > b.second;
	}
};

vector<int> dijkstra(int node) {
	priority_queue<pii, vector<pii>, cmp> pq;
	vector<int> dist(n + 1, INF);
	dist[node] = 0;
	pq.push({ node, 0 });
	while (!pq.empty()) {
		int now = pq.top().first;
		int cost = pq.top().second;

		pq.pop();
		for (int i = 0; i < graph[now].size(); i++) {
			int next = graph[now][i].first;
			int nextCost = graph[now][i].second;
			if (cost + nextCost < dist[next]) {
				dist[next] = cost + nextCost;
				pq.push({ next, dist[next] });
			}
		}
	}
	return dist;
}

int main() {
	cin >> n >> m;
	for (int i = 0; i < m; i++) {
		int a, b, c;
		cin >> a >> b >> c;
		graph[a].push_back({ b, c });
		graph[b].push_back({ a, c });
	}

	int s, t;
	cin >> s >> t;
	vector<int> temp = dijkstra(s);
	cout << temp[t];
	return 0;
}
728x90