Hello Ocean! ๐ŸŒผ

[๋ฐฑ์ค€/C++] 1238. ํŒŒํ‹ฐ ๋ณธ๋ฌธ

Algorithm

[๋ฐฑ์ค€/C++] 1238. ํŒŒํ‹ฐ

bba_dda 2021. 4. 28. 17:54
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ 

www.acmicpc.net/problem/1238

 

1238๋ฒˆ: ํŒŒํ‹ฐ

์ฒซ์งธ ์ค„์— N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 10,000), X๊ฐ€ ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋˜์–ด ์ž…๋ ฅ๋œ๋‹ค. ๋‘ ๋ฒˆ์งธ ์ค„๋ถ€ํ„ฐ M+1๋ฒˆ์งธ ์ค„๊นŒ์ง€ i๋ฒˆ์งธ ๋„๋กœ์˜ ์‹œ์ž‘์ , ๋์ , ๊ทธ๋ฆฌ๊ณ  ์ด ๋„๋กœ๋ฅผ ์ง€๋‚˜๋Š”๋ฐ ํ•„์š”ํ•œ ์†Œ์š”์‹œ๊ฐ„ Ti๊ฐ€ ๋“ค์–ด

www.acmicpc.net

ํ’€์ด

๋ชจ๋“  ๋งˆ์„ ์นœ๊ตฌ๋“ค i (1~N)์— ๋Œ€ํ•ด์„œ 

์™•๋ณต ๊ฑฐ๋ฆฌ = i ๋ถ€ํ„ฐ X๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ + X๋ถ€ํ„ฐ i๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ ๋ฅผ ๊ตฌํ•œ ํ›„,

์™•๋ณต ๊ฑฐ๋ฆฌ์˜ ์ตœ๋Œ“๊ฐ’์„ ์ถœ๋ ฅํ•˜๋ฉด ๋˜๋Š” ๋ฌธ์ œ์ด๋‹ค.  

 

๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•˜์—ฌ ๋ชจ๋“  ๋งˆ์„ ~ ๋ชจ๋“  ๋งˆ์„ ๊นŒ์ง€์˜ ์ตœ์†Ÿ๊ฐ’์„ ๊ตฌํ•œ ํ›„ 

์™•๋ณต ๊ฑฐ๋ฆฌ์˜ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•˜๋ฉด ๋œ๋‹ค. 

 

์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์ด์šฉํ•œ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„์— ๊ฝค๋‚˜ ์ต์ˆ™ํ•ด์ง„ ๊ฒƒ ๊ฐ™๋‹ค.

๋‹ค๋งŒ, ์ž…๋ ฅ์„ ์ธ์ ‘๋ฆฌ์ŠคํŠธ๋กœ ๋ฐ›์•„์•ผ ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๊ธฐ์–ตํ•ด์•ผ ํ•จ..! 

 

+ fill()์„ ์ด์šฉํ•ด 2์ฐจ์› ๋ฐฐ์—ด ์ฑ„์šฐ๋Š”๋ฐ, ์ธ๋ฑ์Šค ์ˆซ์ž๋ฅผ ์ž˜๋ชป ์ ์–ด์„œ ๋งค์šฐ ๊ณ ์ƒํ–ˆ๋‹ค. 

1001์นธ ์งœ๋ฆฌ ๋ฐฐ์—ด์ด๋ฉด ์ธ๋ฑ์Šค๊ฐ€ 1000๊นŒ์ง€๋ผ๋Š”๊ฑธ ๊ธฐ์–ตํ•˜์ž ์™œ ๊นŒ๋จน์€๊ฑธ๊นŒ..? 

์ฝ”๋“œ

#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>

using namespace std;

#define INF 987654321

vector<pair<int, int>> adjs[1001];
int min_route[1001][1001];
int N, M, X;

void Dijkstra(int start) {
	priority_queue<pair<int, int>> pq;
	pq.push(make_pair(0, start));
	min_route[start][start] = 0;

	while (!pq.empty()) {
		int cost = -pq.top().first;
		int cur = pq.top().second;
		pq.pop();
		if (min_route[start][cur] < cost) continue;
		for (int i = 0;i < adjs[cur].size();i++) {
			int there = adjs[cur][i].first;
			int new_cost = cost + adjs[cur][i].second;
			if (new_cost < min_route[start][there]) {
				min_route[start][there] = new_cost;
				pq.push(make_pair(-new_cost,there));
			}
		}
	}
}
int main(void) {
	cin >> N >> M >> X;
	for (int i = 0;i < M;i++) {
		int start, end, cost;
		cin >> start >> end >> cost;
		adjs[start].push_back(make_pair(end, cost));
	}
	fill(&min_route[0][0], &min_route[1000][1001], INF);
	for (int start = 1;start <= N;start++) {
		Dijkstra(start);
	}
	int maxD = 0;
	for (int start = 1;start <= N;start++) {
		int cost = min_route[start][X] + min_route[X][start];
		maxD = max(maxD, cost);
	}
	cout << maxD << endl;
	return 0;
}

๊ฒฐ๊ณผ

 

๋ฐ˜์‘ํ˜•