1. 程式人生 > >dijkstra演算法求單源最短路徑長度並輸出最短路徑 程式碼

dijkstra演算法求單源最短路徑長度並輸出最短路徑 程式碼

程式碼

/*
6 8 0
0 1 1
0 3 4
0 4 4
1 3 2
2 5 1
3 2 2
3 4 3
4 5 3
*/

#include<iostream>
#include<algorithm>

using namespace std;
const int maxv = 1000;
const int INF = 1000000000;

int n, m, s;
int G[maxv][maxv];
int d[maxv];
bool vis[maxv] = {false};
int pre[maxv];

void dijistra(int s)
{
    fill(d, d+maxv, INF);
    d[s] = 0;

    for(int i = 0; i < n; i++)
    {
        int u = -1, MIN = INF;

        for(int j = 0; j < n; j++)
        {
            if(vis[j] == false && d[j] < MIN)
            {
                u = j;
                MIN = d[j];
            }
        }

        if(u == -1) return;

        vis[u] = true;
        for(int v = 0; v < n; v++)
        {
            if(vis[v] == false && G[u][v] != INF && d[u] + G[u][v] < d[v])
            {
                d[v] = G[u][v] + d[u];
                pre[v] = u;
            }
        }

    }

}

void dfs(int s, int v)
{
    if(v == s)
    {
        printf("%d ", s);
        return;
    }
    dfs(s, pre[v]);
    printf("%d ", v);
}

int main()
{
    int u, v, w;
    scanf("%d %d %d",&n, &m, &s);

    fill(G[0], G[0]+maxv*maxv, INF);
    for(int i = 0; i < m; i++)
    {
        scanf("%d%d%d",&u, &v, &w);
        G[u][v] = w;
    }

    dijistra(s);

    for(int i = 0; i < n; i++)
    {
        printf("%d ",d[i]);
    }

    cout << endl;
    
    //輸出最短路徑
    for(int i = 0; i < n; i++)
    {
        dfs(0, i);
        cout << endl;
    }

    return 0;
}

具體過程以後再補

執行測例:

6 8 0
0 1 1
0 3 4
0 4 4
1 3 2
2 5 1
3 2 2
3 4 3
4 5 3

輸出結果:

0 1 5 3 4 6
0
0 1
0 1 3 2
0 1 3
0 4
0 1 3 2 5