๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ป DEV/Algorithms & Data Structure

[์•Œ๊ณ ๋ฆฌ์ฆ˜][C++] Dijkstra (๋‹ค์ต์ŠคํŠธ๋ผ) / ์ตœ๋‹จ ๊ฒฝ๋กœ ํƒ์ƒ‰

by vodkassi 2024. 3. 11.
728x90

๋ฐฑ์ค€ 5972 : ํƒ๋ฐฐ ๋ฐฐ์†ก

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

 

5972๋ฒˆ: ํƒ๋ฐฐ ๋ฐฐ์†ก

๋†๋ถ€ ํ˜„์„œ๋Š” ๋†๋ถ€ ์ฐฌํ™์ด์—๊ฒŒ ํƒ๋ฐฐ๋ฅผ ๋ฐฐ๋‹ฌํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ง€๊ธˆ, ๊ฐˆ ์ค€๋น„๋ฅผ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ‰ํ™”๋กญ๊ฒŒ ๊ฐ€๋ ค๋ฉด ๊ฐ€๋Š” ๊ธธ์— ๋งŒ๋‚˜๋Š” ๋ชจ๋“  ์†Œ๋“ค์—๊ฒŒ ๋ง›์žˆ๋Š” ์—ฌ๋ฌผ์„ ์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ํ˜„์„œ๋Š”

www.acmicpc.net

 

 

์ ‘๊ทผ ๋ฐฉํ–ฅ ๋ฐ ๋””๋ฒ„๊น…

[1] ์ตœ์ดˆ ์ ‘๊ทผ

- N * N ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด ์ •์ ๋ณ„๋กœ ์—ฐ๊ฒฐ๋œ ์ •์ ๊ณผ์˜ ๊ฑฐ๋ฆฌ๋ฅผ ํ‘œ์‹œํ•˜๊ณ , ์ดํ›„ ์šฐ์„ ์ˆœ์œ„ํ์™€ Visited ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•ด ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•˜๊ณ ์ž ํ•จ

- ํ•ด๋‹น ์ ‘๊ทผ์œผ๋กœ TC ๋‹ต์€ ๋‚˜์™”์œผ๋‚˜, ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ 128 MB ๋กœ ์ œํ•œ๋˜์–ด ์žˆ์–ด์„œ ์•ฝ 3% ๋Œ€๋ถ€ํ„ฐ ๋ฉ”๋ชจ๋ฆฌ ํ„ฐ์ง

- ๋‹น์—ฐํ•จ.. N ์˜ ์ตœ๋Œ€๊ฐ’์ด 50000 ์ด๋ผ๋Š” ์ ์„ ์ œ๋Œ€๋กœ ํ™•์ธํ•˜์ง€ ์•Š์Œ 

 

[2] ์ˆ˜์ •๋œ ์ ‘๊ทผ

- ๋˜‘๊ฐ™์ด 2์ฐจ์› ๋ฐฐ์—ด์„ ๋งŒ๋“ค๋˜, N * N ์ด ์•„๋‹Œ N * n (ํ•ด๋‹น ์ •์ ๊ณผ ์—ฐ๊ฒฐ๋œ ์ •์ ์˜ ์ˆ˜) ๋กœ ์ˆ˜์ • 

- ๊ฐ ์ •์ ์„ ๋Œ๋ฉด์„œ ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ์ •์ ์„ ํ™•์ธํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰ 

- ์„ฑ๊ณต

 

์ฝ”๋“œ

/*
	1, 2, 3 ์ฐจ: ์ปดํŒŒ์ผ ์—๋Ÿฌ (limits ๋Œ€์‹  climits ์‚ฌ์šฉํ•˜๋‹ˆ ok)
	4์ฐจ:		๋ฉ”๋ชจ๋ฆฌ ์—๋Ÿฌ (3%) -> INT_MAX ์ œ๊ฑฐ
	5์ฐจ:		๋ฉ”๋ชจ๋ฆฌ ์—๋Ÿฌ (3%) -> priority queue ์ œ๊ฑฐ 
	6์ฐจ:		๋ฉ”๋ชจ๋ฆฌ ์—๋Ÿฌ (3%) -> 2์ฐจ์› ๋ฐฐ์—ด์ด ๋ฌธ์ œ์ธ ๊ฑธ ๊นจ๋‹ซ๊ณ  ๋กœ์ง ์ˆ˜์ •
	7์ฐจ:		์„ฑ๊ณต!! (5240KB, 88ms)			 
*/

/* 7์ฐจ ์‹œ๋„ */
#include <stdio.h>
#include <iostream>
#include <vector>
#include <queue>
#include <utility>
#include <climits>

using namespace std;
int main() {

	freopen("input.txt", "r", stdin);
	
	int N, M;
	cin >> N >> M;

	vector<vector<pair<int, int>>> arr(N + 1);
	
	for (int i = 0; i < M; i++) {
		int A, B, C;
		cin >> A >> B >> C;
		arr[A].push_back(make_pair(B, C));
		arr[B].push_back(make_pair(A, C));
	}

	vector<int> res(N + 1, INT_MAX);
	priority_queue<pair<int, int>> q;

	q.push(make_pair(0, 1));
	res[1] = 0;

	while (!q.empty()) {

		pair<int, int> tmp = q.top(); q.pop();
		int cur = tmp.second;
		int dist = tmp.first;

		for (int i = 0; i < arr[cur].size(); i++) {
			int nextNode = arr[cur][i].first;
			int nextDist = arr[cur][i].second;
			if (res[cur] + nextDist < res[nextNode]) {
				res[nextNode] = res[cur] + nextDist;
				q.push(make_pair(nextDist * -1, nextNode));
			}
		}

	}

	cout << res[N];

	return 0;
}

/* 4์ฐจ ์‹œ๋„
#include <stdio.h>
#include <queue>
#include <vector>
#include <iostream>
#include <climits> // INT_MAX
#include <utility>

using namespace std;

int main() {

	//freopen("input.txt", "r", stdin);

	int N, M;
	cin >> N >> M;

	vector<vector<int>> arr(N + 1);
	for (int i = 1; i <= N; i++) {
		arr[i].resize(N + 1, -1);
	}

	for (int i = 0; i < M; i++) {
		int A, B, C;
		cin >> A >> B >> C;
		arr[A][B] = C;
		arr[B][A] = C;
	}

	vector<int> res(N + 1, INT_MAX);
	vector<int> V(N + 1, 0);
	priority_queue<pair<int, int>> q;
	q.push(make_pair(0, 1));

	while (!q.empty()) {

		pair<int, int> cur = q.top(); q.pop();
		int dist = cur.first * -1;
		int node = cur.second;
		V[node] = 1;

		for (int i = 1; i <= N; i++) {
			if (V[i]) continue;
			if (arr[node][i] == -1) continue;

			int minDist = res[i];
			int curDist = dist + arr[node][i];

			if (curDist < minDist) {
				res[i] = curDist;
				q.push(make_pair(-curDist, i));
			}
		}

	}

	cout << res[N];

	return 0;
}
*/

 

๋ฐฐ์šด ์ 

- ๋ฌธ์ œ ํ’€์ด ์ „์— ์‹œ๊ฐ„ ๋ณต์žก๋„, ๊ณต๊ฐ„ ๋ณต์žก๋„๋ฅผ ์ •ํ™•ํžˆ ์ž˜ ๊ณ„์‚ฐํ•ด๋ณด์ž.. ๋‚˜ ์ด์ œ ํŒŒ์ด์ฌ ์•ˆ ์“ด๋‹ค C++ ์“ด๋‹ค

 

๋Œ“๊ธ€