https://www.acmicpc.net/problem/10971
10971λ²: μΈνμ μν 2
첫째 μ€μ λμμ μ Nμ΄ μ£Όμ΄μ§λ€. (2 ≤ N ≤ 10) λ€μ Nκ°μ μ€μλ λΉμ© νλ ¬μ΄ μ£Όμ΄μ§λ€. κ° νλ ¬μ μ±λΆμ 1,000,000 μ΄νμ μμ μ μμ΄λ©°, κ° μ μλ κ²½μ°λ 0μ΄ μ£Όμ΄μ§λ€. W[i][j]λ λμ iμμ j
www.acmicpc.net
λ¬Έμ
μΈνμ μν λ¬Έμ λ μμ΄λ‘ 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 |