DFS(剪枝条件下的)TSP问题
#include <iostream>
#include <vector>
using namespace std;
const int INF = 100000;
int graph[100][100];
int visited[100];
int node;
int edge;
int path_distance = INF;
vector<int> path;
int get_forward_loop_sum(vector<int> path)
{
int sum = 0;
for(int i = 0;i < path.size() - 1;i++){
sum += graph[path[i]][path[i+1]];
}
return sum;
}
int get_backward_loop_sum(vector<int> path)
{
int start = path[0];
int end = path[path.size()-1];
return graph[start][end];
}
void print(vector<int> array)
{
for(int i = 0;i < array.size();i++){
cout << array[i] << " ";
}
cout << endl;
}
void dfs(vector<int> x_path, int pre)
{
if(x_path.size() == node){
int x_distance = 0;
x_distance += get_forward_loop_sum(x_path);
x_distance += get_backward_loop_sum(x_path);
path_distance = min(path_distance, x_distance);
path = x_path;
return;
}
else if(get_forward_loop_sum(x_path) < path_distance){
for(int i = 0;i < node;i++){
if(visited[i] == 0 and graph[pre][i] < INF){
visited[i] = 1;
x_path.push_back(i);
dfs(x_path, i);
x_path.pop_back();
visited[i] = 0;
}
}
}
}
void init()
{
for(int i = 0;i < node;i++){
for(int j = 0;j < node;j++){
graph[i][j] = INF;
}
}
}
int main()
{
cin >> node >> edge;
init();
for(int i = 0;i < edge; i++){
int p_x, p_y, p_dis;
cin >> p_x >> p_y >> p_dis;
graph[p_x][p_y] = p_dis;
graph[p_y][p_x] = p_dis;
}
vector<int> x_path;
visited[0] = 1;
x_path.push_back(0);
dfs(x_path, 0);
system("pause");
return 0;
}