# 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);
}