https://www.acmicpc.net/problem/10971
๋ฌธ์
์ธํ์ ์ํ ๋ฌธ์ ๋ ์์ด๋ก Traveling Salesman problem (TSP) ๋ผ๊ณ ๋ถ๋ฆฌ๋ ๋ฌธ์ ๋ก computer science ๋ถ์ผ์์ ๊ฐ์ฅ ์ค์ํ๊ฒ ์ทจ๊ธ๋๋ ๋ฌธ์ ์ค ํ๋์ด๋ค. ์ฌ๋ฌ ๊ฐ์ง ๋ณ์ข ๋ฌธ์ ๊ฐ ์์ผ๋, ์ฌ๊ธฐ์๋ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ํํ์ ๋ฌธ์ ๋ฅผ ์ดํด๋ณด์.
1๋ฒ๋ถํฐ N๋ฒ๊น์ง ๋ฒํธ๊ฐ ๋งค๊ฒจ์ ธ ์๋ ๋์๋ค์ด ์๊ณ , ๋์๋ค ์ฌ์ด์๋ ๊ธธ์ด ์๋ค. (๊ธธ์ด ์์ ์๋ ์๋ค) ์ด์ ํ ์ธํ์์ด ์ด๋ ํ ๋์์์ ์ถ๋ฐํด N๊ฐ์ ๋์๋ฅผ ๋ชจ๋ ๊ฑฐ์ณ ๋ค์ ์๋์ ๋์๋ก ๋์์ค๋ ์ํ ์ฌํ ๊ฒฝ๋ก๋ฅผ ๊ณํํ๋ ค๊ณ ํ๋ค. ๋จ, ํ ๋ฒ ๊ฐ๋ ๋์๋ก๋ ๋ค์ ๊ฐ ์ ์๋ค. (๋งจ ๋ง์ง๋ง์ ์ฌํ์ ์ถ๋ฐํ๋ ๋์๋ก ๋์์ค๋ ๊ฒ์ ์์ธ) ์ด๋ฐ ์ฌํ ๊ฒฝ๋ก๋ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ ์ ์๋๋ฐ, ๊ฐ์ฅ ์ ์ ๋น์ฉ์ ๋ค์ด๋ ์ฌํ ๊ณํ์ ์ธ์ฐ๊ณ ์ ํ๋ค.
๊ฐ ๋์๊ฐ์ ์ด๋ํ๋๋ฐ ๋๋ ๋น์ฉ์ ํ๋ ฌ W[i][j]ํํ๋ก ์ฃผ์ด์ง๋ค. W[i][j]๋ ๋์ i์์ ๋์ j๋ก ๊ฐ๊ธฐ ์ํ ๋น์ฉ์ ๋ํ๋ธ๋ค. ๋น์ฉ์ ๋์นญ์ ์ด์ง ์๋ค. ์ฆ, W[i][j] ๋ W[j][i]์ ๋ค๋ฅผ ์ ์๋ค. ๋ชจ๋ ๋์๊ฐ์ ๋น์ฉ์ ์์ ์ ์์ด๋ค. W[i][i]๋ ํญ์ 0์ด๋ค. ๊ฒฝ์ฐ์ ๋ฐ๋ผ์ ๋์ i์์ ๋์ j๋ก ๊ฐ ์ ์๋ ๊ฒฝ์ฐ๋ ์์ผ๋ฉฐ ์ด๋ด ๊ฒฝ์ฐ W[i][j]=0์ด๋ผ๊ณ ํ์.
N๊ณผ ๋น์ฉ ํ๋ ฌ์ด ์ฃผ์ด์ก์ ๋, ๊ฐ์ฅ ์ ์ ๋น์ฉ์ ๋ค์ด๋ ์ธํ์์ ์ํ ์ฌํ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ๋์์ ์ N์ด ์ฃผ์ด์ง๋ค. (2 ≤ N ≤ 10) ๋ค์ N๊ฐ์ ์ค์๋ ๋น์ฉ ํ๋ ฌ์ด ์ฃผ์ด์ง๋ค. ๊ฐ ํ๋ ฌ์ ์ฑ๋ถ์ 1,000,000 ์ดํ์ ์์ ์ ์์ด๋ฉฐ, ๊ฐ ์ ์๋ ๊ฒฝ์ฐ๋ 0์ด ์ฃผ์ด์ง๋ค. W[i][j]๋ ๋์ i์์ j๋ก ๊ฐ๊ธฐ ์ํ ๋น์ฉ์ ๋ํ๋ธ๋ค.
ํญ์ ์ํํ ์ ์๋ ๊ฒฝ์ฐ๋ง ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ์ธํ์์ ์ํ์ ํ์ํ ์ต์ ๋น์ฉ์ ์ถ๋ ฅํ๋ค.
๋ฐฑ์ค ์ค๋ฒ2.
Traveling Salesman Problem, ์ค์ฌ์ TSP
์ด๊ฑฐ ์๊ณ ๋ฆฌ์ฆ ์์ ์๊ฐ์ ๋ฐฐ์ ๋ ๊ฒ ๊ฐ์
TSP๋ NP-Hard ๋ฌธ์ ์ ์ผ์ข ์ด๋ค. ๊ฐ๋จํ ๋งํ๋ฉด ๊ทธ๋ฅ ํ๊ธฐ ์ด๋ ค์ด ๋ฌธ์ ๋ผ๋ ๋ป์ด๋ค
main ideas
1. ์ผ๋จ ๋ฌด์ง์ฑ dfs...ํ๋ฉด ๋๋๋ฐ, ๋ฐฑํธ๋ํน์ ์ํด dfs ๋ค์์ ์ํ๋ฅผ ๊ธฐ์กด์ผ๋ก ๋๋ ค๋๋ ์ฝ๋๊ฐ ์์ด์ผ ํจ.
๊ทธ๋ฆฌ๊ณ ๋ชจ๋ ์์์ ์ ๊ณ ๋ คํด์ผํ๊ธฐ ๋๋ฌธ์ ์์ ํ์ -> ์ฌ๊ท ์ง์ ํ ๋๋ ๋ฐ๋ณต๋ฌธ ํ์ํจ
2. ๋ฐฉ๋ฌธํ๋ ค๋ ๋ค์ ๋ง์์ ๋ฐฉ๋ฌธํ์ ์ด ์๊ฑฐ๋, ๊ฐ๋ ๊ฒฝ๋ก๊ฐ ์๋ค๋ฉด continue
3. ๋ง์ง๋ง ๋ง์์์ ์ถ๋ฐ์ง๋ก ๋์๊ฐ ์ ์์ด์ผ ํ๋์ ๊ฒฝ๋ก๋ก ์ธ์ ๋จ. (์ํ ๊ฐ๋ฅ)
4. ์ต์๊ฐ์ ์ ์ธ ์ INT_MAX๋ก ํด๋๊ณ , ์ํํ๋ฉด์ ์ต์๊ฐ์ ์ ์ฅํ๊ธฐ
๋์ ํ์ด
#include <iostream>
#include <algorithm>
#include <climits>
using namespace std;
int n;
int w[10][10] = {0};
int visited[10] = {0};
int answer = INT_MAX;
void travel(int start, int now, int cnt, int sum){
if(cnt == n){
if(w[now][start] == 0) return; // ๋ง์ง๋ง ๋ง์์์ ์ถ๋ฐ์ง๋ก ๋ชป ๋์๊ฐ๋
if(answer > sum + w[now][start]) answer=sum+w[now][start]; // ์ต์๊ฐ ๋์ฒด
return;
}
for (int i = 0; i < n; ++i){
if(visited[i]==1 || w[now][i]==0) continue; // ๋ง์๋ฐฉ๋ฌธ or ๊ธธ์์๋
visited[i] = 1;
travel(start, i, cnt + 1, sum + w[now][i]);
visited[i] = 0; // ํ์ ์ข
๋ฃ ํ ๋ค๋ฅธ๊ฒฝ๋ก๋ก ํ์์ ์ํด ๋๋๋ ค๋๊ธฐ
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n;
for (int i = 0; i < n; ++i){
for (int j = 0; j < n; ++j){
cin >> w[i][j];
}
}
for (int i = 0; i < n; ++i){
visited[i] = 1;
travel(i, i, 1, 0);
visited[i] = 0; // ๋ค์ ๋ฐ๋ณต์ ์ํด ๋๋๋ ค๋๊ธฐ
}
cout << answer;
}
'๐ ์๊ณ ๋ฆฌ์ฆ > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[C++/BOJ] 9251 : LCS (DP) (0) | 2023.03.16 |
---|---|
[C++/BOJ] 9465 : ์คํฐ์ปค (DP) (1) | 2023.03.15 |
[C++/BOJ] 9663 : N-Queen (์์ ํ์, Backtracking) (0) | 2023.03.06 |
[C++/BOJ] 1158 : ์์ธํธ์ค ๋ฌธ์ (Queue) (0) | 2023.03.03 |
[C++/BOJ] 7562 : ๋์ดํธ์ ์ด๋ (BFS) (0) | 2023.03.02 |