某售货员要到若干城市去推销商品,已知各城市之间的路程(或旅费)。他要选定一条从驻地出发,经过每个城市一遍,最后回到驻地的路线,使总的路程(或总旅费)最小。
输入格式:
第一行为城市数n
下面n行n列给出一个完全有向图,如 i 行 j 列表示第 i 个城市到第 j 个城市的距离。
输出格式:
一个数字,表示最短路程长度。
输入样例:
3
0 2 1
1 0 2
2 1 0
输出样例:
3
代码
#include <iostream>
#include <cstring>
using namespace std;
int max_ = 32767; //定义一个最大值
int citynum; //城市数
int currentcost; //记录当前的路程
int bestcost; //记录最小的路程(最优)
int Graph[100][100]; //图的边距记录
int x[100]; //记录行走顺序
int bestx[100]; //记录最优行走顺序
void InPut()
{
int len; //距离
cin>>citynum;
memset(Graph, 0, sizeof(Graph));
for(int i = 1; i <=citynum; ++i)
{
for(int j=1;j<=citynum;++j){
cin>>len;
Graph[i][j]=len;
}
}
}
//初始化
void Initilize()
{
currentcost = 0;
bestcost = max_;
for(int i = 1; i <= citynum; ++i)
{
x[i] = i;
}
}
void BackTrack(int i) //这里的i代表第i步去的城市而不是代号为i的城市
{
if(i == citynum)
{
if(currentcost + Graph[x[i - 1]][x[i]] + Graph[x[i]][x[1]] < bestcost || bestcost == max_)
{
bestcost = currentcost + Graph[x[i - 1]][x[i]] + Graph[x[i]][x[1]];
for(int j = 1; j <= citynum; ++j)
bestx[j] = x[j];
}
}
else
{
for(int j = i; j <= citynum; ++j)
{
if(currentcost + Graph[x[i - 1]][x[j]] < bestcost || bestcost == max_)
{
swap(x[i], x[j]); //这里i 和 j的位置交换了, 所以下面的是currentcost += Graph[x[i - 1]][x[i]];
currentcost += Graph[x[i - 1]][x[i]];
BackTrack(i + 1); //递归进入下一个城市
currentcost -= Graph[x[i - 1]][x[i]];
swap(x[i], x[j]);
}
}
}
}
void OutPut()
{
cout<<bestcost<<endl;
}
int main()
{
InPut();
Initilize();
BackTrack(2);
OutPut();
}