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

 

 

 

 參考:《啊哈算法》書籍  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM