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๋ก ๊ฐ๊ธฐ ์ํ ๋น์ฉ์ ๋ํ๋ธ๋ค.
ํญ์ ์ํํ ์ ์๋ ๊ฒฝ์ฐ๋ง ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ์ธํ์์ ์ํ์ ํ์ํ ์ต์ ๋น์ฉ์ ์ถ๋ ฅํ๋ค.
ํ์ด
40% ์์ ํ๋ ธ์ต๋๋ค ๊ฐ ๋์ค๋ฉด...
w[i][j]๊ฐ 0์ธ๊ฒฝ์ฐ i์์ j๋ก ๊ฐ ์ ์๋ค๋ ์ ์ ๊ตฌํํด์ฃผ์...
// Authored by : seondal
// Co-authored by : -
// #include <bits/stdc++.h>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int n;
vector<vector<int>> input;
vector<bool> isVisit; // ์ง์ญ i์ ๋ฐฉ๋ฌธ ์ฌ๋ถ
vector<int> cost; // ๊ฐ๋ฅํ ์ด๋ ๋น์ฉ๋ค
void recur(int start, int cur, int cnt, int sum){
// n๊ฐ ์ง์ญ์ ์ ๋ถ ๋ฐฉ๋ฌธํ๊ณ , ์ถ๋ฐ์ง๋ก ๋์๊ฐ ์ ์๋ค๋ฉด
if(cnt==n && input[cur][start]!=0) {
sum += input[cur][start];
cost.push_back(sum);
return;
}
for(int i=0; i<n; i++) { // ๋ค์ ํ์ ์ง ์ฐพ๊ธฐ
if(isVisit[i] || input[cur][i]==0) // ์ด๋ฏธ ๋ฐฉ๋ฌธํ๊ฑฐ๋ ๊ฐ ์ ์๋ค๋ฉด ํจ์ค
continue;
isVisit[i] = true;
recur(start, i, cnt+1, sum+input[cur][i]);
isVisit[i] = false;
}
}
int solution() {
for(int i=0; i<n; i++) {
isVisit[i] = true;
recur(i,i,1,0);
isVisit[i] = false;
}
sort(cost.begin(), cost.end());
int minCost = cost[0];
return minCost;
}
int main() {
cin >> n;
input.assign(n, vector<int>(n,0));
isVisit.assign(n, false);
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
cin >> input[i][j];
cout << solution();
return 0;
}
/*
*/
'๐๏ธ ICPC Sinchon > Backtracking' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ][C++] ๋ฐฑ์ค 14888๋ฒ: ์ฐ์ฐ์ ๋ผ์๋ฃ๊ธฐ (0) | 2023.07.06 |
---|---|
[BOJ][C++] ๋ฐฑ์ค 15811๋ฒ: ๋ณต๋ฉด์ฐ?! (0) | 2023.01.22 |
[BOJ][C++] ๋ฐฑ์ค 2661๋ฒ: ์ข์์์ด (0) | 2023.01.22 |
[BOJ][C++] ๋ฐฑ์ค 2580๋ฒ: ์ค๋์ฟ (0) | 2023.01.22 |
[BOJ][C++] ๋ฐฑ์ค 23304๋ฒ: ์์นด๋ผ์นด (0) | 2023.01.21 |