#include<iostream>
#include<iomanip>
using namespace std;
int n;
int cost[20][20]={};
bool done[20]={1};
int start = 0; //从城市0开始
int imin(int num, int cur)
{
if(num==1) //递归调用的出口
return cost[cur][start]; //所有节点的最后一个节点,最后返回 最后一个节点到起点的路径
int mincost = 10000;
for(int i=0; i<n; i++)
{
cout<<i<<" i:"<<done[i]<<endl;
if(!done[i] && i!=start) //该结点没加入 且 非起始点
{
if(mincost <= cost[cur][i]+cost[i][start])
{
continue; //其作用为结束本次循环。即跳出循环体中下面尚未执行的语句。区别于break
}
done[i] = 1; //递归调用时,防止重复调用
int value = cost[cur][i] + imin(num-1, i);
if(mincost > value)
{
mincost = value;
}
done[i] = 0;//本次递归调用完毕,让下次递归调用
}
}
return mincost;
}
int main()
{
// cin >> n;
n=4;
int cc[4][4]={{0 ,4, 1, 3},
{4 ,0 ,2, 1},
{1 ,2 ,0, 5},
{3 ,1, 5, 0}};
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
//cin >> cost[i][j];
cost[i][j]=cc[i][j];
}
}
cout << imin(n, start) << endl;
return 0;
}
TSP
最新推荐文章于 2023-04-14 23:55:04 发布