一:做出成本矩阵
1.城市连通图:
2.直接相邻城市距离表格:
3. 做成距离成本矩阵:
①直接相邻的城市填入成本;例如A->T 成本为3.6 则将A行T列和T行A列都填入3.6
②不直接相邻的填入0;
③主对角线填0,视为自己和自己不可达。
注意:一定要按照城市顺序(A->Z)来排表格
二:代码部分
#include<iostream>
#include<string>
#include<vector>
using namespace std;
double a[26][26];
double cost = 0;
double mincost = 10000000;//初始化最低成本,视为无穷
int used[26] = { 0 };
vector<char> coststr, mincoststr;
void fact(char Delcity, char Reccity)
{
if (a[Delcity - 64][Reccity - 64] != 0)
{
cost += a[Delcity - 64][Reccity - 64];
coststr.push_back(Reccity);
if (cost < mincost)
{
mincost = cost;
mincoststr.clear();
mincoststr.assign(coststr.begin(), coststr.end());
}
cost -= a[Delcity - 64][Reccity - 64];
coststr.pop_back();
}
for (int i = 1; i <= 25; i++)
{
if (a[Delcity - 64][i] != 0 && used[i] != 1)
{
coststr.push_back(i + 64);
coststr.push_back('-');
coststr.push_back('>');
cost += a[Delcity - 64][i];
used[i] = 1;
fact(i + 64, Reccity);//后面是要回溯的部分
used[i] = 0;
cost -= a[Delcity - 64][i];
coststr.pop_back();
coststr.pop_back();
coststr.pop_back();
}
}
}
int main()
{
cout << "请输入cost矩阵" << endl;
for (int i = 1; i <= 25; i++)
{
for (int j = 1; j <= 25; j++)
{
cin >> a[i][j];//cost矩阵
}
}
int k;//城市对的数量
char city[100][2];//城市对
cout << "请输入城市对数:" << endl;
cin >> k;
cout << "请输入起点和终点城市" << endl;
for (int i = 0; i < k; i++) cin >> city[i][0] >> city[i][1];
char Delcity, Reccity;
cout << "cined" << endl;
cout << "城市" << "->" << "城市" << "\t" << "最短路径" << "\t" << "最小固定成本:" << endl;
for (int y = 0; y < k; y++)
{
Delcity = city[y][0], Reccity = city[y][1];
coststr.push_back(Delcity);
coststr.push_back('-');
coststr.push_back('>');
mincoststr.push_back(Delcity);
mincoststr.push_back('-');
mincoststr.push_back('>');
used[Delcity - 64] = 1;
fact(Delcity, Reccity);
cout << Delcity << "->" << Reccity << "\t\t";
vector<char>::iterator ite = mincoststr.begin();
for (; ite != mincoststr.end(); ite++)//输出最短路径
{
cout << *ite;
}
cout << "\t";
cout << mincost << endl;
/*重新初始化,准备寻找下一个输入的最短路径*/
mincoststr.clear();
coststr.clear();
for (int i = 0; i < 26; i++)
{
used[i] = 0;
}
cost = 0;
mincost = 10000000;
}
return 0;
}
三:样例输出
请输入cost矩阵
0 0 2.4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3.6 0 0 0 0 0
0 0 0 0 0 0 0 3.6 3.6 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
2.4 0 0 0 0 0 0 0 0 0 0 1.2 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 2.4 0 0 0 0 0 3.6
0 0 0 0 0 0 0 0 0 0 0 0 0 2.4 0 2.4 0 0 0 2.4 0 0 1.8 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.4 0 0 3 0 0 3 1.2 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 2.4 0 0 0 0 0 1.2 0 1.8 0 0
0 4.2 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 3 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 3.6 0 0 0 0 2.4 0
0 3 0 0 0 0 0 1.8 0 0 1.8 0 0 0 0 0 0 0 0 0 0 0 0 3.6 0
0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 2 0 0 0 3 0 0 0
0 0 1.2 0 0 0 0 0 0 0 0 0 0 2.4 0 0 0 0 0 3.6 0 0 0 0 0
0 0 0 3.6 0 0 0 0 1.2 0 0 0 0 0 1.8 0 0 0 0 0 0 0 0 0 0
0 0 0 0 3 0 0 0 0 0 0 3 0 0 0 0 3 0 0 0 0 0 0 0 0
0 0 0 0 0 1.2 1.2 0 0 0 0 0 2.4 0 0 0 0 0 0 0 0 0 0 2.4 0
0 0 0 0 1.2 0 0 0 0 0 0 0 0 0 0 0 1.8 0 0 0 1.8 1.2 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 2.4 0 1.2 0 0 0 0 0 0 0 0 0
0 0 0 0 0 3.6 0 0 0 0 2.4 0 0 0 0 0 0 0 0 0 0 0 0 2.4 0
0 0 0 2.4 0 0 0 0 2.4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2.4
3.6 0 0 0 2.4 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 1.2 4.2 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 1.8 0 0
0 0 0 0 0 2.4 0 0 0 0 2 0 0 0 0 1.8 0 0 0 0 0 0 0 0 0
0 0 0 0 2.2 0 1.2 0 0 0 0 0 0 0 0 0 0 0 0 0 1.2 0 0 0 0
0 0 0 0 0 0 0 0 2.4 1.8 0 0 0 0 2.4 0 0 1.8 0 0 0 0 0 0 0
0 0 0 2.4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2.4 0 0 0 0 0 0
请输入城市对数:
4
请输入起点和终点城市
P D
P H
P C
E Y
输出:
城市->城市 最短路径 最小固定成本:
P->D P->U->F->O->M->D 10.4
P->H P->V->K->J->H 8
P->C P->E->N->L->C 7.8
E->Y E->W->G->O->M->I->S->Y 15
输出格式自己调就行了。