Doby's Lab

[알고리즘] 백준 5590번: 船旅 (C++) 본문

PS/BOJ

[알고리즘] 백준 5590번: 船旅 (C++)

도비(Doby) 2021. 12. 13. 20:02

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

 

5590번: 船旅

入力の 1 行目には2つの整数 n, k (1 ≦ n ≦ 100, 1 ≦ k ≦ 5000) が書かれている. これは,島の数が n 島で,入力が k + 1 行からなることを表す.  i + 1 行目 (1 ≦ i ≦ k) には, 3 個または 4 個の

www.acmicpc.net

파파고 돌려서 번역했다. 다익스트라 문제였다.

0 b c: b에서 c로 가는 최단 경로를 구하라. 갈 수 없다면 -1

1 b c d: 는 b와 c를 이어주는 가중치가 d인 양방향 경로가 생긴다.

[AC 코드]

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

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

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

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

		pq.pop();
		if (dist[now] < cost) {
			continue;
		}

		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() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cin >> n >> k;
	for (int i = 0, a; i < k; i++) {
		cin >> a;
		if (a == 0) {
			int b, c;
			cin >> b >> c;
			vector<int> temp = dijkstra(b);
			if (temp[c] == INF) {
				cout << -1 << '\n';
			}
			else {
				cout << temp[c] << '\n';
			}
		}
		else {
			int b, c, d;
			cin >> b >> c >> d;
			graph[b].push_back({ c, d });
			graph[c].push_back({ b, d });
		}
	}
	return 0;
}
728x90