旅行售货员问题1
2012-06-08 07:06
288 查看
# include <iostream.h>
/*
利用全排列解决旅行售货员问题(最短路程或最少旅费)
*/
int cost[5][5]={{0,0,0,0,0},{0,0,30,6,4},{0,30,0,5,10,},{0,6,5,0,20},{0,4,10,20,0}};
double bestc = 9999;
int Num = 0;
int i;
template <typename T>
void Perm(T list[],int k,int m)
{
if(k==m)
{
Num++;
cout<<"路线"<<Num<<":";
for(i=0;i<=m+1;i++)
{
cout<<list[i]<<" ";
}
cout<<"费用"<<":";
double cc = 0;
for(i=0;i<=m;i++)
{
cc+=cost[list[i]][list[i+1]];
}
cout<<cc<<endl;
if(cc<bestc)
bestc=cc;
cout<<endl;
}
else
for(int i=k;i<=m;i++)
{
Swap(list[k],list[i]);
Perm(list,k+1,m);
Swap(list[k],list[i]);
}
}
template <typename T>
inline void Swap(T &a,T &b)
{
T temp = a; a = b;b=temp;
}
void main()
{
int list[5] = {1,2,3,4,1};
Perm(list,1,3);
}
/*
利用全排列解决旅行售货员问题(最短路程或最少旅费)
*/
int cost[5][5]={{0,0,0,0,0},{0,0,30,6,4},{0,30,0,5,10,},{0,6,5,0,20},{0,4,10,20,0}};
double bestc = 9999;
int Num = 0;
int i;
template <typename T>
void Perm(T list[],int k,int m)
{
if(k==m)
{
Num++;
cout<<"路线"<<Num<<":";
for(i=0;i<=m+1;i++)
{
cout<<list[i]<<" ";
}
cout<<"费用"<<":";
double cc = 0;
for(i=0;i<=m;i++)
{
cc+=cost[list[i]][list[i+1]];
}
cout<<cc<<endl;
if(cc<bestc)
bestc=cc;
cout<<endl;
}
else
for(int i=k;i<=m;i++)
{
Swap(list[k],list[i]);
Perm(list,k+1,m);
Swap(list[k],list[i]);
}
}
template <typename T>
inline void Swap(T &a,T &b)
{
T temp = a; a = b;b=temp;
}
void main()
{
int list[5] = {1,2,3,4,1};
Perm(list,1,3);
}
相关文章推荐
- 旅行售货员问题
- ZOJ1037 题目大意就是 计算在这个国家中所有城市的旅行售货员问题的最短长度,每个城市位于矩形网格的点上,方向有八个,单位长度为1
- 哈密尔顿回路(旅行售货员问题)的回溯算法
- 双调旅行售货员问题
- 分支限界法----旅行售货员问题
- 【dp】双调旅行售货员问题
- 分支限界法----旅行售货员问题
- 算法5.旅行售货员问题和数独游戏。
- 分支限界法----旅行售货员问题
- 旅行售货员问题 回溯法 与 01背包的区别
- 回溯法_旅行售货员问题
- 旅行售货员问题(回溯、分枝限界)
- 旅行售货员问题
- 旅行售货员问题的回溯法求解
- 回溯法----旅行售货员问题
- 欧式空间上旅行售货员问题 (TSP问题) 的2-近似算法。
- 旅行售货员问题(回溯法实现)
- 旅行售货员问题
- C语言使用回溯法解旅行售货员问题与图的m着色问题
- 分支限界法----旅行售货员问题