#include <iostream>
#include <vector>
#include <algorithm>
#include <ctime>
using namespace std;
#define MAX 10
int cnt = 0; // 가능한 경로의 수
int n; // 도시의 수
double dist[MAX][MAX]; // 두 도시 간의 거리를 저장하는 배열
// path: 지금까지 만든 경로
// visited: 각 도시의 방문 여부
// currentLength: 지금까지 만든 경로의 길이
// 나머지 도시들을 모두 방문하는 경로들 중 가장 짧은 것의 길이를 반환한다.
double shortestPath(vector<int>& path, vector<bool>& visited, double currentLength)
{
// 기저 사례: 모든 도시를 방문하면 시작 도시로 돌아가고 종료한다.
if (path.size() == n)
{
cnt++;
cout << "# " << cnt << ": ";
for (auto ele : path)
cout << ele << " ";
cout << endl;
return currentLength + dist[path[0]][path.back()]; // 시작 도시와 마지막 도시 간의 길이
}
double ret = LLONG_MAX; // 매우 큰 값으로 초기화
// 다음 방문할 도시를 전부 시도
for (int next = 0; next < n; next++)
{
if (visited[next]) continue;
int here = path.back();
path.push_back(next);
visited[next] = true;
// 나머지 경로를 재귀 호출을 통해 완성하고 가장 짧은 경로의 길이를 얻는다.
double cand = shortestPath(path, visited, currentLength + dist[here][next]);
ret = min(ret, cand);
visited[next] = false;
path.pop_back();
}
return ret;
}
int main()
{
cin >> n;
// 랜덤으로 dist 형성하기
for (int r = 0; r < n; r++)
{
for (int c = 0; c < n; c++)
{
if (r == c) dist[r][c] = 0; // 같은 도시인 경우
srand((unsigned int)time(NULL)); // srand에 입력되는 seed 값에 따라 rand() 함수의 결과가 달라짐
int diff = rand() % 9; // 도시 간 길이는 10이하 자연수라고 가정
if (diff == 0) // 도시 간 길이는 0보다 커야하므로 1로 설정
diff++;
dist[r][c] = diff;
}
}
vector<int> path;
vector<bool> visited(n);
path.push_back(0);
visited[0] = true;
int ans = shortestPath(path, visited, 0);
cout << ans << endl;
return 0;
}
Leave a comment