旅行售货员 回溯法 pta

编程入门 行业动态 更新时间:2024-10-10 04:19:40

旅行<a href=https://www.elefans.com/category/jswz/34/1752719.html style=售货员 回溯法 pta"/>

旅行售货员 回溯法 pta

某售货员要到若干城市去推销商品,已知各城市之间的路程(或旅费)。他要选定一条从驻地出发,经过每个城市一遍,最后回到驻地的路线,使总的路程(或总旅费)最小。

输入格式:

第一行为城市数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();
}

 

更多推荐

旅行售货员 回溯法 pta

本文发布于:2024-03-23 14:51:32,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1739460.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:售货员   旅行   pta

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!