BOJ 1753. ์ต๋จ๊ฒฝ๋ก
๐โโ๏ธ[Gold IV] ์ต๋จ๊ฒฝ๋ก - 1753
์ฑ๋ฅ ์์ฝ
๋ฉ๋ชจ๋ฆฌ: 9192 KB, ์๊ฐ: 100 ms
๋ถ๋ฅ
๋ฐ์ดํฌ์คํธ๋ผ, ๊ทธ๋ํ ์ด๋ก , ์ต๋จ ๊ฒฝ๋ก
์ ์ถ ์ผ์
2024๋ 1์ 3์ผ 20:07:13
๋ฌธ์ ์ค๋ช
๋ฐฉํฅ๊ทธ๋ํ๊ฐ ์ฃผ์ด์ง๋ฉด ์ฃผ์ด์ง ์์์ ์์ ๋ค๋ฅธ ๋ชจ๋ ์ ์ ์ผ๋ก์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค. ๋จ, ๋ชจ๋ ๊ฐ์ ์ ๊ฐ์ค์น๋ 10 ์ดํ์ ์์ฐ์์ด๋ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ์ ์ ์ ๊ฐ์ V์ ๊ฐ์ ์ ๊ฐ์ E๊ฐ ์ฃผ์ด์ง๋ค. (1 โค V โค 20,000, 1 โค E โค 300,000) ๋ชจ๋ ์ ์ ์๋ 1๋ถํฐ V๊น์ง ๋ฒํธ๊ฐ ๋งค๊ฒจ์ ธ ์๋ค๊ณ ๊ฐ์ ํ๋ค. ๋์งธ ์ค์๋ ์์ ์ ์ ์ ๋ฒํธ K(1 โค K โค V)๊ฐ ์ฃผ์ด์ง๋ค. ์ ์งธ ์ค๋ถํฐ E๊ฐ์ ์ค์ ๊ฑธ์ณ ๊ฐ ๊ฐ์ ์ ๋ํ๋ด๋ ์ธ ๊ฐ์ ์ ์ (u, v, w)๊ฐ ์์๋๋ก ์ฃผ์ด์ง๋ค. ์ด๋ u์์ v๋ก ๊ฐ๋ ๊ฐ์ค์น w์ธ ๊ฐ์ ์ด ์กด์ฌํ๋ค๋ ๋ป์ด๋ค. u์ v๋ ์๋ก ๋ค๋ฅด๋ฉฐ w๋ 10 ์ดํ์ ์์ฐ์์ด๋ค. ์๋ก ๋ค๋ฅธ ๋ ์ ์ ์ฌ์ด์ ์ฌ๋ฌ ๊ฐ์ ๊ฐ์ ์ด ์กด์ฌํ ์๋ ์์์ ์ ์ํ๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค๋ถํฐ V๊ฐ์ ์ค์ ๊ฑธ์ณ, i๋ฒ์งธ ์ค์ i๋ฒ ์ ์ ์ผ๋ก์ ์ต๋จ ๊ฒฝ๋ก์ ๊ฒฝ๋ก๊ฐ์ ์ถ๋ ฅํ๋ค. ์์์ ์์ ์ 0์ผ๋ก ์ถ๋ ฅํ๊ณ , ๊ฒฝ๋ก๊ฐ ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ์๋ INF๋ฅผ ์ถ๋ ฅํ๋ฉด ๋๋ค.
๐ํ์ด
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๋ฌธ์ ๋ฅผ ํ์ด์ผํ๋ค.
์ฐ์ ์์ ํ๋ฅผ ์ฌ์ฉํ๋๋ฐ ๊ทธ ์ด์ ๋ ๋งค๋ฒ ์ต์๊ฐ์ ์ฐพ์์ผํ๋๋ฐ ์ฐ์ ์์ํ๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด O(N)์๊ฐ์ด ๊ฑธ๋ฆฌ๋๋ฐ ์ฐ์ ์์ ํ๋ O(logN)์ด ๊ฑธ๋ฆฌ๊ธฐ ๋๋ฌธ์ด๋ค.
์ต์๊ฐ์ ์ฐพ์ผ๋ฉด ๊ทธ ์ ์ ์์ ์ฐ๊ฒฐ๋ ์ ์ ๋ค์ ์ดํ๋ค.
์ด ๋ ์ต์๊ฐ์ ์ด๋ค ๊ฒฝ์ฐ์๋ ๋ ์์์ง์์๋ ๊ฐ์ด๋ผ๋๊ฒ์ด ์ค์ํ๋ค.
๐์ ์ฒด ์ฝ๋
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include<iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
struct Edge
{
int v;
int dist;
bool operator<(const Edge& other) const
{
return dist > other.dist;
}
};
int n, m, k, a, b, c;
int ch[30];
priority_queue<Edge> pq;
vector<vector<pair<int, int>>> graph;
vector<int> dist;
void solve()
{
cin >> n >> m >> k;
// ๋ชจ๋ ์ ์ ๊น์ง์ ๊ฑฐ๋ฆฌ๋ ๋งค์ฐ ํฐ ์ซ์๋ก ์ด๊ธฐํ
dist = vector<int>(n + 1, 123456789);
graph = vector<vector<pair<int, int>>>(n + 1);
// ๊ฐ์ค์น ๋ฐฉํฅ ๊ทธ๋ํ ์์ฑ
for (int i = 1; i <= m; ++i)
{
cin >> a >> b >> c;
graph[a].push_back({ b, c });
}
// ์ฐ์ ์์ ํ ์์ ์ ์ ์ฝ์
pq.push({ k, 0 });
dist[k] = 0; // ์ฒ์ ์์์ ๊ฑฐ๋ฆฌ๊ฐ 0
while (pq.empty() == false)
{
int cur = pq.top().v;
int cost = pq.top().dist;
pq.pop();
// ์ด๋ฏธ ๋ฐฉ๋ฌธํ ๊ณณ์ธ๋ฐ ๋ ์์ ๊ฐ์ด ์กด์ฌํ๋ค๋ฉด ์คํต
if (cost > dist[cur])
continue;
// ์ ์ ๊ณผ ์ฐ๊ฒฐ๋ ์ ์ ๋ค ์ํ
for (int i = 0; i < graph[cur].size(); ++i)
{
int next = graph[cur][i].first;
int nextCost = cost + graph[cur][i].second; // ์ด์ ๊น์ง์ ๋น์ฉ๊ณผ ๊ฐ์ ์ ๊ฐ์ค์น์ ํฉ
if (nextCost < dist[next]) // ์ฐ๋๋ฐฐ๊ธฐ ์์ ๊ฐ
{
dist[next] = nextCost; // ๊ฑฐ๋ฆฌ๊ฐ ๊ฐฑ์
pq.push({ next, nextCost }); // ์ฐ์ ์์ ํ์ ์ฝ์
}
}
}
for (int i = 1; i <= n; ++i)
{
if (dist[i] == 123456789)
cout << "INF" << '\n';
else
cout << dist[i] << '\n';
}
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
//freopen("input.txt", "rt", stdin);
solve();
return 0;
}