DFS搜索城市间最短路径(C++代码)

一:做出成本矩阵

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

输出格式自己调就行了。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值