어떤 지점 s에서 출발해서 모든 정점을 거치고 다시 s로 돌아오는 경우를 모두 탐색했다. O(N!)
매 번 "모든 정점을 방문했는가?" 를 확인하면서 모두 방문했다면 현재가 s인가(출발점 == 종료점)를 판별해서 그렇다면 그때의 값이 최소가 되게 했다.
이동할 때마다 가중치를 더한다. 모든 정점을 방문했을 때 자신으로 돌아온게 아니라면 답이 아니도록 했다.
어떤 지점 s는 어디건 상관없다. 출발점과 도착점이 같은 지점을 찾는다면, 그 지점이 어디건 정답인 경우의 경로는 똑같이 나온다.
#include <bits/stdc++.h>
using namespace std;
#define INF 987654321
bool visit[11];
int g[11][11], n;
int tsp(int first, int cur){
bool allSearch = true;
for(int i=0; i<n; ++i) allSearch &= visit[i];
if(allSearch && cur == first) return 0;
int r = INF;
for(int i=0; i<n; ++i){
if(i != cur && !visit[i]){
visit[i] = true;
r = min(r, g[cur][i] + tsp(first, i));
visit[i] = false;
}
}
return r;
}
int main(){
int i, j;
scanf("%d", &n);
for(i=0; i<n; ++i)
for(j=0; j<n; ++j)
scanf("%d ", &g[i][j]);
printf("%d", tsp(1, 1));
return 0;
}
댓글 없음:
댓글 쓰기