hades

[Baekjoon] 11675๋ฒˆ: ํƒ€์ž„๋จธ์‹  ๋ณธ๋ฌธ

๐Ÿ‘Š PS/Algorithm

[Baekjoon] 11675๋ฒˆ: ํƒ€์ž„๋จธ์‹ 

hades1 2024. 8. 6. 21:06

๐Ÿฅ… ๋ฌธ์ œ

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

 

๐Ÿ” ์„ค๊ณ„

์Œ์ˆ˜์ธ ๊ฐ„์„ ์ด ์กด์žฌํ•˜๋ฏ€๋กœ, ๋ฒจ๋งŒ ํฌ๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ๋ฐ์ดํฌ์ŠคํŠธ๋ผ๋ฅผ ์ด์šฉํ•œ๋‹ค๋ฉด ์Œ์ˆ˜ ๊ฐ„์„ ์œผ๋กœ ์ธํ•ด ๊ฑฐ๋ฆฌ๊ฐ€ ์Œ์˜ ๋ฌดํ•œ๋Œ€๋กœ ๊ณ„์† ๊ฐฑ์‹ ๋˜์–ด ๋ฌดํ•œ ๋ฃจํ”„์— ๋น ์ง€๊ฒŒ ๋œ๋‹ค.

 

๊ธฐ๋ณธ์ ์ธ ๋ฒจ๋งŒ ํฌ๋“œ ์‹์€ Dx(y) = min(Dx(y), Dx(z) + z~y)์ด๋‹ค. x์—์„œ y๊นŒ์ง€์˜ ์ตœ์†Œ ๊ฑฐ๋ฆฌ๋Š” x์—์„œ z๊นŒ์ง€ ์ตœ์†Œ ๊ฑฐ๋ฆฌ + z์—์„œ y๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ ์ค‘ ์ตœ์†Ÿ๊ฐ’์ด๋‹ค. ๋ฒจ๋งŒ ํฌ๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ฒจ๋งŒ ํฌ๋“œ ์‹ ์ ์šฉ์ด ํ™•์‚ฐ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

 

๋ฌผ๋ก , ๋ฒจ๋งŒ ํฌ๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋„ ์‚ฌ์ดํด๋กœ ์ธํ•ด ์Œ์˜ ๋ฌดํ•œ๋Œ€๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ์ •์ ์˜ ๊ฐœ์ˆ˜๊ฐ€ n์ด๋ผ๊ณ  ํ•  ๋•Œ, ํ•œ ์ •์ ์—์„œ ๋‹ค๋ฅธ ์ •์ ๋“ค๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๋ชจ๋‘ ๊ฐฑ์‹ ํ•˜๋Š”๋ฐ๋Š” n-1๋ฒˆ ๋ชจ๋“  ๊ฐ„์„ ์— ๋Œ€ํ•ด ๋ฒจ๋งŒ ํฌ๋“œ ์‹์„ ์ ์šฉํ•˜๋ฉด ๋œ๋‹ค. ํ•œ ์ •์ ์—์„œ ์–ด๋–ค ์ •์ ์œผ๋กœ ๊ฐ€๋Š”๋ฐ ๊ฐ„์„ ์„ ์ตœ๋Œ€ n-1๋ฒˆ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ ์ด์ƒ ๊ฐฑ์‹ ์ด ์ด๋ฃจ์–ด์ง„๋‹ค๋ฉด, ์Œ์˜ ๊ฐ„์„ ์ด ํฌํ•จ๋œ ์‚ฌ์ดํด ๋•Œ๋ฌธ์œผ๋กœ ๋ณด๋ฉด ๋œ๋‹ค.

 

๐Ÿ‘Š ํ’€์ด

#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;

long long n, m, a, b, c;
vector<long long> dist(501, 1e9 + 7);
vector<vector<int>> edges(6000, vector<int>(3));

bool bf(int start) {
	dist[start] = 0;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			int cur_node = edges[j][0];
			int next_node = edges[j][1];
			int cost = edges[j][2];
			if (dist[cur_node] != 1e9+7 && dist[next_node] > dist[cur_node] + cost) {
				dist[next_node] = dist[cur_node] + cost;
				if (i == n - 1) {
					return true;
				}
			}
		}
	}
	return false;
}

int main(void)
{
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	cin >> n >> m;
	for (int i = 0; i < m; i++) {
		for (int j = 0; j < 3; j++) {
			cin >> edges[i][j];
		}
	}
	
	bool result = bf(1);
	if (result) {
		cout << -1 << "\n";
	}
	else {
		for (int i = 2; i <= n; i++) {
			if (dist[i] == 1e9 + 7) {
				cout << -1 << "\n";
			}
			else {
				cout << dist[i] << "\n";
			}
		}
	}

	return 0;
}