Algorithm/๋ฌธ์ œํ’€์ด

[๋ฐฑ์ค€] 1916๋ฒˆ - ์ตœ์†Œ๋น„์šฉ ๊ตฌํ•˜๊ธฐ (C++)

moaoh 2023. 9. 24. 22:10

 

1916๋ฒˆ: ์ตœ์†Œ๋น„์šฉ ๊ตฌํ•˜๊ธฐ

์ฒซ์งธ ์ค„์— ๋„์‹œ์˜ ๊ฐœ์ˆ˜ N(1 ≤ N ≤ 1,000)์ด ์ฃผ์–ด์ง€๊ณ  ๋‘˜์งธ ์ค„์—๋Š” ๋ฒ„์Šค์˜ ๊ฐœ์ˆ˜ M(1 ≤ M ≤ 100,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์…‹์งธ ์ค„๋ถ€ํ„ฐ M+2์ค„๊นŒ์ง€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฒ„์Šค์˜ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋จผ์ € ์ฒ˜์Œ์—๋Š” ๊ทธ

www.acmicpc.net

๋ฌธ์ œ

N๊ฐœ์˜ ๋„์‹œ๊ฐ€ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•œ ๋„์‹œ์—์„œ ์ถœ๋ฐœํ•˜์—ฌ ๋‹ค๋ฅธ ๋„์‹œ์— ๋„์ฐฉํ•˜๋Š” M๊ฐœ์˜ ๋ฒ„์Šค๊ฐ€ ์žˆ๋‹ค. ์šฐ๋ฆฌ๋Š” A๋ฒˆ์งธ ๋„์‹œ์—์„œ B๋ฒˆ์งธ ๋„์‹œ๊นŒ์ง€ ๊ฐ€๋Š”๋ฐ ๋“œ๋Š” ๋ฒ„์Šค ๋น„์šฉ์„ ์ตœ์†Œํ™” ์‹œํ‚ค๋ ค๊ณ  ํ•œ๋‹ค. A๋ฒˆ์งธ ๋„์‹œ์—์„œ B๋ฒˆ์งธ ๋„์‹œ๊นŒ์ง€ ๊ฐ€๋Š”๋ฐ ๋“œ๋Š” ์ตœ์†Œ๋น„์šฉ์„ ์ถœ๋ ฅํ•˜์—ฌ๋ผ. ๋„์‹œ์˜ ๋ฒˆํ˜ธ๋Š” 1๋ถ€ํ„ฐ N๊นŒ์ง€์ด๋‹ค.

 

 

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ๋„์‹œ์˜ ๊ฐœ์ˆ˜ N(1 ≤ N ≤ 1,000)์ด ์ฃผ์–ด์ง€๊ณ  ๋‘˜์งธ ์ค„์—๋Š” ๋ฒ„์Šค์˜ ๊ฐœ์ˆ˜ M(1 ≤ M ≤ 100,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์…‹์งธ ์ค„๋ถ€ํ„ฐ M+2์ค„๊นŒ์ง€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฒ„์Šค์˜ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋จผ์ € ์ฒ˜์Œ์—๋Š” ๊ทธ ๋ฒ„์Šค์˜ ์ถœ๋ฐœ ๋„์‹œ์˜ ๋ฒˆํ˜ธ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๋‹ค์Œ์—๋Š” ๋„์ฐฉ์ง€์˜ ๋„์‹œ ๋ฒˆํ˜ธ๊ฐ€ ์ฃผ์–ด์ง€๊ณ  ๋˜ ๊ทธ ๋ฒ„์Šค ๋น„์šฉ์ด ์ฃผ์–ด์ง„๋‹ค. ๋ฒ„์Šค ๋น„์šฉ์€ 0๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , 100,000๋ณด๋‹ค ์ž‘์€ ์ •์ˆ˜์ด๋‹ค.

๊ทธ๋ฆฌ๊ณ  M+3์งธ ์ค„์—๋Š” ์šฐ๋ฆฌ๊ฐ€ ๊ตฌํ•˜๊ณ ์ž ํ•˜๋Š” ๊ตฌ๊ฐ„ ์ถœ๋ฐœ์ ์˜ ๋„์‹œ๋ฒˆํ˜ธ์™€ ๋„์ฐฉ์ ์˜ ๋„์‹œ๋ฒˆํ˜ธ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ถœ๋ฐœ์ ์—์„œ ๋„์ฐฉ์ ์„ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋งŒ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„๋‹ค.

 

 

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ์ถœ๋ฐœ ๋„์‹œ์—์„œ ๋„์ฐฉ ๋„์‹œ๊นŒ์ง€ ๊ฐ€๋Š”๋ฐ ๋“œ๋Š” ์ตœ์†Œ ๋น„์šฉ์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

 

ํ’€์ด๊ณผ์ •

์ถœ๋ฐœ ๋„์‹œ์—์„œ ๋„์ฐฉ ๋„์‹œ๊นŒ์ง€ ๊ฐ€๋Š”๋ฐ ๋“œ๋Š” ์ตœ์†Œ ๋น„์šฉ์„ ๊ตฌํ•ด์•ผํ•˜๋Š” ๋ฌธ์ œ.

๋‹ค์ต์ŠคํŠธ๋ผ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ œ์˜ ์ ‘๊ทผํ•˜์˜€์Šต๋‹ˆ๋‹ค.

์‹œ์ž‘ ๋„์‹œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ชจ๋“  ๋„์‹œ๋ฅผ ๋Œ๊ณ  ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰์ด๋˜๊ณ  ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ์ค„์ด๊ธฐ์œ„ํ•ด์„œ ๊ฐ€์žฅ ์ž‘์€ ๋น„์šฉ์˜ ๊ฐ’๋ถ€ํ„ฐ ๋กœ์ง์„ ๋„๋Š”๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ์— ๋‚˜์•„๊ฐˆ ๋„์‹œ๋“ค์„ ๋น„๊ตํ•ด๊ฐ€๋ฉด์„œ next๋„์‹œ์— ์ ํ˜€์žˆ๋Š” ๋น„์šฉ๋ณด๋‹ค ์ง€๊ธˆ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋น„์šฉ์ด ์ž‘๋‹ค๋ฉด que์— push๋ฅผ ํ•˜์—ฌ ๋กœ์ง์„ ์ถ”๊ฐ€์ ์œผ๋กœ ๋” ๋„๋Š” ๋ฐฉ์‹

 

code

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

std::vector <std::pair<int, int> > vec[100001];
int		dp[1001];
int INF = 100000001;

void	dijkstra(int n, int sPos)
{
	std::priority_queue <std::pair <int, int> > pQue;

	dp[sPos] = 0;
	pQue.push(std::make_pair(sPos, 0));
	while (!pQue.empty())
	{
		int posCity = pQue.top().first;
		int posCost = -pQue.top().second;
		pQue.pop();
		if (dp[posCity] < posCost) continue;
		for (int i = 0; i < vec[posCity].size(); i++)
		{
			int nextCity = vec[posCity][i].first;
			int nextCost = posCost + vec[posCity][i].second;
			if (nextCost < dp[nextCity]) {
				dp[nextCity] = nextCost;
				pQue.push(std::make_pair(nextCity, -nextCost));
			}
		}
	}
}

int		main(void)
{
	int n, m, stmp, etmp, sPos, ePos, cost;

	std::cin >> n >> m;
	for (int i = 0; i < m; i++) {
		std::cin >> stmp >> etmp >> cost;
		vec[stmp].push_back(std::make_pair(etmp, cost));
	}
	std::cin >> sPos >> ePos;
	for (int i = 1; i <= n; i++) {
		dp[i] = INF;
	}
	dijkstra(n, sPos);
	std::cout << dp[ePos] << "\n";

	return (0);
}

 

ํ›„๊ธฐ

์ƒ๋‹นํžˆ ์–ด๋ ต๋‹ค. ๋‚˜์ค‘์— ๋‹ค์‹œ ๋„์ „ํ•ด๋ด์•ผํ•  ๋ฌธ์ œ