DFS求解两点之间的最短路径

我们都知道DFS可以求解没有权值(即两点之间的距离是1)的图中两点的最短距离,但是DFS还可以求解含权值的两点的距离最小值

例子

输入:

5 8(n m 分别是点、边的个数)
1 5(s e 分别是起点与终点)
1 2 2(接下来是8条边的点、权值)
1 5 10
2 3 3
2 5 7
3 1 4
3 4 4
4 5 5
5 3 3

代码

#include<iostream>
#include<algorithm>
using namespace std;
int visited[200];
int n, m,s,e;
int edges[200][200];
#define  inf  0x3f3f3f3f
int mins = inf;
void dfs(int cru,int dis)
{
    if (dis > mins)return;
    if (cru == e)
    {
        if (dis < mins)mins = dis;
        return;
    }
    for (int j = 1; j <= n; j++)
    {
        if (edges[cru][j] != inf&&!visited[j])
        {
            visited[j] = 1;
            dfs(j, dis + edges[cru][j]);
            visited[j] = 0;
        }
    }
    return;
}
int main()
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    std::cout.tie(0);
    cin >> n >> m;
    cin >> s >> e;
    fill(edges[0], edges[0] + 200 * 200, inf);
    for (int i = 0; i < m; i++)
    {
        int a, b,c;
        cin >> a >> b>>c;
        edges[a][b] = c;
    }
    visited[s] = 1;
    dfs(s, 0);
    cout << mins;
}

//5 8
//1 5
//1 2 2
//1 5 10
//2 3 3
//2 5 7
//3 1 4
//3 4 4
//4 5 5
//5 3 3

 

 

 

 参考:《啊哈算法》书籍  

posted @ 2020-05-11 16:29  Jason66661010  阅读(1756)  评论(0编辑  收藏  举报