最短路径问题

在这里插入图片描述

#include<iostream>
using namespace std;
#define nmax 100
#define inf 999999999
int minpath, n, m, en, edge[nmax][nmax], mark[nmax];//最短路径,节点数,边数,终点,邻接矩阵,节点访问标记
void dfs(int cur, int dst)      //dsf代表当前路径,当前走过的公路数,cur代表出发的城市
{
    if (minpath < dst) return;//当前走过的路径大于之前的最短路径,没有必要再走下去了
    if (cur == en) {//临界条件,当走到终点n
        if (minpath > dst) {
            minpath = dst;
            return;
        }
    }
    for (int i = 1;i <= n;i++) {
        if (mark[i] == 0 && edge[cur][i] != inf && edge[cur][i] != 0) {
            mark[i] = 1;
            dfs(i, dst + edge[cur][i]);
            mark[i] = 0;//需要在深度遍历返回时将访问标志置0
        }
    }
    return;
}
int main()
{
    while (cin >> n >> m && n != 0) {
        //初始化邻接矩阵
        for (int i = 1;i <= n;i++) {
            for (int j = 1;j <= n;j++) {
                edge[i][j] = inf;
            }
            edge[i][i] = 0;        //因为自己和自己没什么好走的,所以为0
        }
        int a, b;     //a代表开始的结点,b代表走到的结点
        while (m--) 
        {
            cin >> a >> b;
            cin >> edge[a][b];
        }
        minpath = inf;
        memset(mark, 0, sizeof(mark));     //就是让mark的所有mark的所有字节都是0,代表没有遍历
        mark[1] = 1;     //开始访问
        en = n;
        dfs(1, 0);
        cout << minpath << endl;
    }
}

在这里插入图片描述
之所有最短路径是9,是因为它是有向图,而不是无向的。

这道题的思路就是:
1.利用两个数组,一个是初始化邻接矩阵,把他们各个城市的路径表示出来,另一个数组则表示此城市是否被遍历
2.要想进行每个节点都遍历还是得用到递归,那么关于递归跳出的条件必然是走过的所有的当前走路径都大于最小路径
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值