[BOJ] 1800 : ์ธํฐ๋ท ์ค์น
๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/1800
1800๋ฒ: ์ธํฐ๋ท ์ค์น
์ฒซ ๋ฒ์งธ ์ค์ N(1 ≤ N ≤ 1,000), ์ผ์ด๋ธ์ ์ ๊ฐ์ P(1 ≤ P ≤ 10,000), ๊ณต์ง๋ก ์ ๊ณตํ๋ ์ผ์ด๋ธ์ ์ ๊ฐ์ K(0 ≤ K < N)์ด ์ฃผ์ด์ง๋ค. ๋ค์ P๊ฐ์ ์ค์๋ ์ผ์ด๋ธ์ด ์ฐ๊ฒฐํ๋ ๋ ์ปดํจํฐ ๋ฒํธ์ ๊ทธ ๊ฐ๊ฒฉ์ด ์ฐจ
www.acmicpc.net
1๋ฒ๊ณผ N๋ฒ ์ปดํจํฐ๋ฅผ ์ฐ๊ฒฐ์ํค๊ธฐ ์ํด ํ์ํ ๋น์ฉ์ค ์ต๋๊ฐ์ ์ต์๊ฐ ๋๋๋กํ๋ ๋ฌธ์ .
ํ์ด
์ผ๋จ 1๋ฒ๊ณผ N๋ฒ ์ปดํจํฐ๋ฅผ ์ต๋ ํจ์จ๋ก ์ฐ๊ฒฐ์์ผ์ผ ํ๋ฏ๋ก ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํด์ผํ๋ ๊ฒ์ ์ ์ ์๋ค. ๊ทธ๋ฐ๋ฐ ๊ธฐ์กด ๋ค์ต์คํธ๋ผ๋ ๋น์ฉ์ด ๊ณ์ํด์ ๋์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ๋์ ๋น์ฉ์ด ๊ฐ์ ์ ๊ฒ ๋ค๋๋ก N์ ๋๋ฌํ๋ ๊ฒ์ด ๋ณดํต์ธ๋ฐ, ์ฌ๊ธฐ์๋ ๋น์ฉ๋ค ์ค ๊ฐ์ฅ ๋น์ผ ๊ฒ์ ๋ํด์๋ง ๋น์ฉ์ ์ง๋ถํ๋ค. ์ฆ 1 -> N์ ์ฐ๊ฒฐ์ํค๋๋ฐ ๊ฐ 4, 5, 6 ์ ๋น์ฉ์ด ๋ค์๋ฐ๊ณ ํ๋ฉด ์ ์ผ ๋น์ผ 6์ ๋ํด์๋ง ๊ฐ์ ์ง๋ถํ๋ค. ๊ทธ๋ฆฌ๊ณ K๊ฐ์ ๋ํด์๋ ๋น์ฉ์ ๋ฐ์ง ์๊ธฐ๋๋ฌธ์ K๊ฐ๋ ๋น์ฉ ์๊ด์์ด ์ฐ๊ฒฐ ๊ฐ๋ฅํ๋ค.
์ผ๋จ ๋จผ์ ๋ ์ฌ๋ฆด ์ ์๋ ๋ค์ต์คํธ๋ผ ์ ๋ ฌ ์กฐ๊ฑด์
1. ๊ฐ๊ฒฉ์ด ์ผ ๊ฒ ์์ผ๋ก ์ฐ๊ฒฐ์ํจ๋ค.
2. ์ฐ๊ฒฐํ๋ ์ ์ ์๊ฐ ์ ๋๋ก ์ฐ๊ฒฐ์ํจ๋ค.
5 7 1
1 2 5
3 1 4
2 4 8
3 2 3
5 2 9
3 4 7
4 5 6
ํ์ง๋ง ๋ ๊ฐ์ง ๊ฒฝ์ฐ ๋ชจ๋ ์์ 1์์ ์ํ๋ ๊ฐ์ ์ถ๋ ฅํ์ง ๋ชปํ๋ค.
1. ๊ฐ๊ฒฉ์ด ์ผ ์์ผ๋ก ์ธํฐ๋ท์ ์ฐ๊ฒฐํ๋ค.
1 -> 3 -> 4-> 5 ๋ก ์ฐ๊ฒฐํ๊ฒ ๋๊ณ ์ด๋ ๋น์ฉ์ด ๊ฐ๊ฐ 4, 7, 6 ์ธ๋ฐ 1๊ฐ๋ ๊ณต์ง๋ก ํ ์ ์์ผ๋๊น 6์ ๋น์ฉ์ ์ง๋ถํ๊ฒ ๋๋ค. ํ์ง๋ง 1 -> 3 -> 2 -> 5 ๋ก ์ฐ๊ฒฐํ๋ฉด ๋น์ฉ์ด 4, 3, 9 ์ธ๋ฐ 9์ ์ง๋ฆฌ๋ ๊ณต์ง๋ก ํ๋ฉด 4์ ๋น์ฉ์ ์ง๋ถํ๊ฒ ๋๋ฏ๋ก ๋ฌด์กฐ๊ฑด ์ผ ์์ผ๋ก ์ฐ๊ฒฐํ๋ ๊ฒ์ ํด๊ฒฐ์ฑ ์ด ๋ ์ ์๋ค.
2. ์ฐ๊ฒฐํ๋ ์ ์ ์๊ฐ ์ต์๊ฐ ๋๋๋ก ์ฐ๊ฒฐํ๋ค.
1 -> 2-> 5 ๋ก ์ฐ๊ฒฐํ๋ฉด 2๋ฒ๋ง์ N์ ๋๋ฌํ๋ค. ์ด๋ ๋น์ฉ์ 5, 9 ๊ฐ ๋ฐ์ํ๊ณ 9์์ง๋ฆฌ๋ฅผ ๊ณต์ง๋ก ํ๋ฉด 5์์ ์ง๋ถํ๊ฒ ๋๋ค. ์ด ์ญ์ 4์๋ณด๋ค ๋น์ฉ์ด ๋ง์ด๋๋๊น ์ ๋ต์ด ์๋๋ค.
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ ๋ง์ผ๋ก ํด๊ฒฐํ ์ ์๋ค๋ ๊ฒ์ ์์๋ค. ์ด๋ถํ์์ ๊ฐ์ด ์จ์ ํ์ด์ผํ๋ค. ์ง๋ถํ๋ ๋น์ฉ์ mid๊ฐ์ผ๋ก ์ค์ ํด์ค๋ค. ๋ฏธ๋ฆฌ ์ ํ ๋น์ฉ(mid)๋ณด๋ค ๋น์ผ ์ ์ K๊ฐ ์ดํ๋ก ์ฐ๊ฒฐํ๊ฒ ๋๋ฉด ๊ทธ๋ mid ๊ฐ์ ์ ํจํ ๊ฐ์ด๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <string.h>
#include <string>
#include <stack>
#include <vector>
#include <math.h>
#include <queue>
#include <climits>
#include <algorithm>
#include <iomanip>
#include <map>
#define mod 998244353
using namespace std;
typedef long long ll;
typedef priority_queue<pair<int, pair<int,int>>, vector<pair<int, pair<int,int>>>, greater<pair<int, pair<int,int>>>> Priority_queue;
const int INF = INT_MAX;
const int MAX_N = 1000 + 5;
vector<pair<int, int>> Edge[MAX_N];
vector<int> dist(MAX_N, INF);
int N, K, P;
bool dijkstra(int st, int boundary) {
Priority_queue pq;
pq.push({ 0 ,{st, 0} });
while (!pq.empty()) {
int now = pq.top().second.first;
int over = pq.top().first;
int cost = pq.top().second.second;
pq.pop();
if (cost > boundary)
over++;
if (over > K)
continue;
if (dist[now] <= over)
continue;
dist[now] = over;
if (now == N)
return true;
for (int i = 0; i < Edge[now].size(); i++) {
int next = Edge[now][i].first;
int acost = Edge[now][i].second;
if (dist[next] <= over)
continue;
pq.push({ over,{next, acost} });
}
}
return false;
}
int main(void)
{
int L = 0; int R = -1;
cin >> N >> P >> K;
for (int i = 0; i < P; i++) {
int a, b, w;
cin >> a >> b >> w;
R = max(R, w);
Edge[a].push_back({ b,w });
Edge[b].push_back({ a,w });
}
int ans = INF;
while (L <= R) {
fill(dist.begin(), dist.end(), INF);
int mid = (L + R) / 2;
if (dijkstra(1, mid)) {
R = mid - 1;
ans = min(ans, mid);
}
else L = mid + 1;
}
if (ans == INF)
cout << "-1\n";
else cout << ans << "\n";
return 0;
}
|
cs |
์๋ฌด๋ฆฌ ๋ง์ ์ ์ ์ฐ๊ฒฐํ๋๋ผ๋ ๋ฏธ๋ฆฌ ์ ํด๋ ๊ฐ mid ๋ณด๋ค ๊ฐ์ด ์ธ๋ค๋ฉด ๋ช ๊ฐ๋ฅผ ์ฐ๊ฒฐํ๋ ์๊ด์ด ์๋ค. ๊ทธ๋์ ์ฐ์ ์์ ํ ์ ๋ ฌ ๊ธฐ์ค์ mid ๋ณด๋ค ๋น์ผ ์ ์ ์ฐ๊ฒฐํ ์๊ฐ ์ ์ ๊ฒ์ ๊ธฐ์ค์ผ๋ก ํด์คฌ๋ค.