๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/5901
5901๋ฒ: Relocation
Input Details There are 5 towns, with towns 1, 2, and 3 having markets. There are 6 roads. Output Details FJ builds his farm in town 5. His daily schedule takes him through towns 5-1-2-3-2-1-5, for a total distance of 12.
www.acmicpc.net
๋ค์ต์คํธ๋ผ๋ฅผ ํ์ฉํ๋ ๋ฌธ์
๋ฌธ์ ํด์
๋ฌธ์ ๋ฅผ ๊ทธ๋๋ก ํด์ํ๊ฒ ์๋๋ผ ํด์ํด์ ์ ๋ฆฌํ ๊ฒ์ด๋ค.
๋๋ถ ์กด์ ๊ทธ์ ์ผ๊ณผ๋์์ ์ต๋จ ๊ฒฝ๋ก๋ก ๋ค๋๊ธฐ ์ํด์ ๋์ฅ์ ์์น๋ฅผ ์ฎ๊ธฐ๋ ค๊ณ ํ๋ค. ์กด์ด ์ด์ฌ๋ฅผ ๊ณํํ๊ณ ์๋ ๋ง์์ ์ด N๊ฐ์ ๋ง์์ด๋ฉฐ ์ด ์ค์์ ํ ๋ง์์ ๊ณจ๋ผ ๊ฑฐ๊ธฐ์ ๋์ฅ์ ์ง์ผ๋ คํ๋ค. N๊ฐ์ ๋ง์ ์ค K๊ฐ์ ๋ง์์๋ ๋งํธ๊ฐ ์์ผ๋ฉฐ ์กด์ ์ผ๊ณผ์๊ฐ์ ๋์ฅ์์ ์ถ๋ฐํด K๊ฐ์ ๋งํธ๋ฅผ ๋๊ณ ๋ค์ ๋์ฅ์ผ๋ก ๋์์์ผํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋งํธ๊ฐ ์๋ ๋ง์์ ๋
๊ฐ์ด ๋น์ธ๊ธฐ ๋๋ฌธ์ ๋งํธ๊ฐ ์๋ ๋ง์์๋ ์ด์ฌ๋ฅผ ๊ฐ์ง ์๋๋ค. ์ฆ, ์ ํ์ง๋ N-K ๊ฐ์ ๋ง์์ด ์๋ค. N-K๊ฐ์ ๋ง์ ์ค์์ ๊ฐ์ฅ ํจ์จ์ ์ผ๋ก ๊ฑฐ๋ฆฌ๊ฐ ์งง๊ฒ ์ผ๊ณผ๋ฅผ ์งํํ ์ ์๋๋ก ํ๋ ๋ง์์ ์ฐพ์์ฃผ์.
ํ์ด
๋ง์ผ์ด 5๊ฐ ์๋ค๊ณ ๊ฐ์ ํ์ ๋ ์์์ ๋์ฅ Farm์ ๋ํด์ ์กด์ ์ผ๊ณผ ์งํ ๊ฒฝ๋ก๋ ์ผ์ชฝ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ ๊ฒ์ด๋ค. ์กด์ด ๊ฐ์ฅ ์งง์ ๊ฑฐ๋ฆฌ๋ก ์ผ๊ณผ๋ฅผ ์งํํ๊ธฐ ์ํด์ ๊ฐ ๋ ธ๋ ์ฌ์ด๋ฅผ ์ต๋จ๊ฑฐ๋ฆฌ๋ก ์งํํ๋ฉด ๋๋ค. ์ฌ๊ธฐ์ ๋งํธ๋ฅผ ๋ฐฉ๋ฌธํ๋ ์์๋ ์๊ด์ด ์๋ค๊ณ ํ๋ค. ํ์ง๋ง ์ด๋ค ๊ฒฝ๋ก๊ฐ ์ต์ ์ ๊ฒฝ๋ก์ผ์ง ๋ชจ๋ฅด๋ ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ๋ค ๋์๋ด์ผํ๋ค. next_permutation(์์ด)์ ์ด์ฉํด์ ๋งํธ๋ฅผ ๋ฐฉ๋ฌธํ๋ ์์๋ฅผ ์ ํด์ฃผ์๋ค. ์ฆ Kํฉํ ๋ฆฌ์ผ ๊ฐ์ ๊ฒฝ์ฐ๋ฅผ ๋ค ๋์๋ณด์๋ค. ๋งํธ๊ฐ ์ต๋ 5๊ฐ๋ผ๊ณ ํ์ผ๋ฏ๋ก ์ต๋ 5! = 120๊ฐ์ง์ ๊ฒฝ์ฐ๊ฐ ์์ ๊ฒ์ด๋ค.
์์์ ๋์ฅ Farm์ ๋ํด์ ์ผ๊ณผ์๊ฐ ์ต๋จ๊ฒฝ๋ก๋ฅผ ๊ณ์ฐํ๊ธฐ ์ํด์๋ ๊ฐ ๋งํธ ์ฌ์ด์ ์ต๋จ๊ฒฝ๋ก์ ์์์ ๋งํธ์ ๋์ฅ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ฅผ ์์์ผํ๋ค.
์ฒ์์๋ dist๋ผ๋ ๋ฐฐ์ด์ 2์ฐจ์์ผ๋ก ๋ง๋ค์ด์ dist[๋งํธ๊ฐ ์๋ ๋ง์์ ๋ฒํธ][์์์ ๋ง์] ์ด๋ ๊ฒ ๋งํธ์์ ๋ง์๊น์ง์ ๊ฑฐ๋ฆฌ๋ฅผ ๋ค์ต์คํธ๋ผ๋ก ๊ณ์ฐํด์ ์ ์ฅํด๋๋ ค๊ณ ํ๋ค. ํ์ง๋ง ์ด๋ ๊ฒ ๋๋ฉด ์์ ๋ฌธ์ ๋ ์ ์ถ๋ ฅ๋์ง๋ง 10000 X 10000 ๊ฐ์ int ๋ฐฐ์ด์ ๋ง๋ค์ด์ผํด์ ๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ๊ฐ ๋ฌ๋ค.
๊ทธ๋ฅ ๋งํธ์ ์ธ๋ฑ์ค๋ฅผ 0,1,2,3,4 ๋ก ์ ํ๊ณ dist[5][MAX_N]์ ๋ฐฐ์ด์ ๋ง๋ค์ด์ฃผ์๋ค. ๊ทธ๋ฆฌ๊ณ ๋งํธ๊ฐ ์๋ ๋ง์์ ๋ฒํธ๋ Market[5] ๋ฐฐ์ด์ ์ ์ธํด์ ๊ฐ ์ธ๋ฑ์ค๋ง๋ค ๋ง์์ ๋ฒํธ๋ฅผ ์ ์ฅํด๋์๋ค.
๋ค์ต์คํธ๋ผ๋ฅผ ์ด์ฉํด์ ๋งํธ์ ๋งํธ์ฌ์ด์ ๊ฑฐ๋ฆฌ, ์์์ ๋งํธ์ ์์์ ๋ง์ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ฅผ ๋ชจ๋ ๊ตฌํด๋์ ๋ค์ ์์ด์ ์ด์ฉํด์ ๋งํธ๋ฐฉ๋ฌธ ์์๋ฅผ ์ ํ๊ณ ๊ฒฝ๋ก์ ๊ฑฐ๋ฆฌ์ ํฉ์ ์ต์๋ฅผ ์ฐพ์์ฃผ๋ฉด ๋๋ค. ์์์ ๋์ฅ Farm์ K๊ฐ์ ๋ง์์ ์ ์ธํ ๋ชจ๋ N-K๊ฐ์ ๋ง์์ด ๋ ์ ์๋ค.
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
38
39
40
41
42
43
44
45
46
47
48
49
|
#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, int>, vector<pair<int, int>>, greater<pair<int, int>>> Priority_queue;
const int INF = INT_MAX;
const int MAX_N = 10000 + 5;
int Market[5];
int N, M, K; // ์ ์ , ๊ฐ์ , ๋งํธ
vector<pair<int, int>> Edge[MAX_N];
int dist[5][MAX_N];
bool is_market[MAX_N];
int ans = INF;
void get_distance() {
int order[5] = { 0,1,2,3,4 }; // ๋งํธ์ ์ธ๋ฑ์ค
do {
int cost = 0;
for (int i = 0; i < K - 1; i++) {
cost += dist[order[i]][Market[order[i + 1]]];
}
for (int i = 1; i <= N; i++) {
if (!is_market[i]) // ์ถ๋ฐ์ ์ผ๋ก ๊ฐ๋ฅํ๋ค๋ฉด
ans = min(ans, cost + dist[order[K-1]][i] + dist[order[0]][i]);
}
} while (next_permutation(order, order + K));
}
void dijkstra(int st) {
Priority_queue pq;
pq.push({ 0, Market[st]});
while (!pq.empty()) {
int now = pq.top().second;
int cost = pq.top().first;
pq.pop();
if (cost >= ans)
break;
if (dist[st][now] != INF)
continue;
if(now != Market[st])
dist[st][now] = cost;
for (int i = 0; i < Edge[now].size(); i++) {
int next = Edge[now][i].first;
int acost = cost + Edge[now][i].second;
if (dist[st][next] != INF)
continue;
pq.push({ acost, next });
}
}
}
void Init() {
for (int i = 0; i <5; i++)
for (int j = 0; j <= N; j++)
dist[i][j] = INF;
}
int main(void) {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> N >> M >> K;
Init();
for (int i = 0; i < K; i++) {
int market; cin >> market;
Market[i] = market;
is_market[market] = true;
}
sort(Market, Market + K);
for (int i = 0; i < M; i++) {
int a, b, w;
cin >> a >> b >> w;
Edge[a].push_back({ b,w });
Edge[b].push_back({ a,w });
}
for (int i = 0; i < K; i++)
dijkstra(i);
get_distance();
cout << ans << "\n";
}
|
cs |
'๋ฐฑ์ค > Gold' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] 10037 : Decorating the Pastures (0) | 2022.04.27 |
---|---|
[BOJ] 13595 : Mania de Par (0) | 2022.04.27 |
[BOJ] 9874 : Wormholes (0) | 2022.04.22 |
[BOJ] 1800 : ์ธํฐ๋ท ์ค์น (0) | 2022.04.20 |
[BOJ] 16639 : ๊ดํธ ์ถ๊ฐํ๊ธฐ 3 (0) | 2022.04.19 |