1. 程式人生 > >單源最短路徑-迪傑斯塔拉(Dijkstra)演算法的實現

單源最短路徑-迪傑斯塔拉(Dijkstra)演算法的實現

/************************************************************************
*
* 檔名:7.1.1.cpp
*
* 檔案描述:Dijkstra演算法的實現(好久沒寫程式碼了,看來我還是適合codeing不適合paper)
*
* 建立人:  fdk

* 時  間:  2018-09-03
*
* 版本號:1.0
*
* 修改記錄:
*
************************************************************************/

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
#include<limits.h>
#define M 100
#define N 100
using namespace std;

typedef struct node
{
    int matrix[N][M];    //鄰接矩陣
    int n;               //頂點數
    int e;               //邊數
}MGraph;

void DijkstraPath(MGraph g, int *dist, int *path, int v0) //v0表示原頂點
{
    int i, j, k;
    bool visited[g.n];
    for (i = 0; i < g.n; i++)    //初始化
    {
        if (g.matrix[v0][i] > 0 && i != v0)
        {
            dist[i] = g.matrix[v0][i];
            path[i] = v0;              //path記錄最短路徑上v0到i的前一個頂點
        }
        else
        {
            dist[i] = INT_MAX;         //如果i不與v0直接相連,則權值為無窮大
            path[i] = -1;
        }
        visited[i] = false;            //初始化都未被訪問過
    }
    dist[v0] = 0;                      //初始化最短距離為0
    visited[v0] = true;

    for (i = 0; i < g.n; i++)          //迴圈擴充套件n-1次
    {
        int min = INT_MAX;
        int u;
        for (j = 0; j < g.n; j++)     //尋找未被擴充套件的的權值最小的頂點
        {
            if (visited[j] == false && dist[j] < min)
            {
                min = dist[j];
                u = j;
            }
        }
        visited[u] = true;

        /*更新dist陣列的值和路徑的值*/
        for (k = 0; k < g.n; k++)
        {
            if (visited[k] == false && g.matrix[u][k] > 0 && min + g.matrix[u][k] < dist[k])
            {
                dist[k] = min + g.matrix[u][k];   //如果新加入的結點使得k的結點值變小則更新
                path[k] = u;
            }
        }

    }
}


void showPrint(int *path, int v, int v0)
{
    /*列印時需要從後往前推導,借用堆疊來實現順序輸出*/
    stack<int> s;
    int u = v;
    while (v != v0)
    {
        s.push(v);
        v = path[v];
    }
    s.push(v);

    while (!s.empty())
    {
        cout << s.top() << " ";
        s.pop();
    }
}
int main()
{
    int n, e; //n為頂點數,e為邊數
    while (cin >> n >> e && e != 0)
    {
        int i, j;
        int s, t, w; //表示存在一條邊s->t,權值為w
        MGraph g;
        int v0;

        int *dist = new int[n]; //最短距離
        int *path = new int[n]; //路徑
        for (i = 0; i < n; i++)
        {
            for (j = 0; j < n; j++)
            {
                g.matrix[i][j] = 0;
            }
        }
        g.n = n;
        g.e = e;
        for (i = 0; i < e; i++)
        {
            cin >> s >> t >> w;
            g.matrix[s][t] = w;
        }
        cin >> v0;              //輸入源頂點
        DijkstraPath(g, dist ,path , v0);
        for (i = 0; i < n; i++)
        {
            if (i != v0)
            {
                showPrint(path, i, v0);
                cout << dist[i] << endl;
            }
        }
    }
    return 0;
}


相關推薦

路徑-Dijkstra演算法實現

/************************************************************************ * * 檔名:7.1.1.cpp * * 檔案描述:Dijkstra演算法的實現(好久沒寫程式碼了,看來我還是適合codeing

路徑——Dijkstra演算法 C++實現

求最短路徑之Dijkstra演算法 Dijkstra演算法是用來求單源最短路徑問題,即給定圖G和起點s,通過演算法得到s到達其他每個頂點的最短距離。 基本思想:對圖G(V,E)設定集合S,存放已被訪問的頂點,然後每次從集合V-S中選擇與起點s的最短距離最小的一個頂點(記為u),訪問並加入集合

無向圖求路徑 dijkstra演算法實現

Dijkstra演算法說明  http://ibupu.link/?id=29namespace ConsoleApp14 { class Program { public static int M = -1; static

圖->路徑->路徑(演算法Dijkstra)

 文字描述   引言:如下圖一個交通系統,從A城到B城,有些旅客可能關心途中中轉次數最少的路線,有些旅客更關心的是節省交通費用,而對於司機,里程和速度則是更感興趣的資訊。上面這些問題,都可以轉化為求圖中,兩頂點最短帶權路徑的問題。     單源點的最短路徑問題: 給定帶權有向圖G

路徑-演算法

思路:    在網路中,從某個頂點Vx出發到達另外一個頂點Vi,往往有多條路徑,其中,邊的權值之和最小的路徑稱為最短路徑,並稱Vx為這條最短路徑的源點,Vi為終點。    顯然,邊最少的路徑不一定是最短路徑。    求網路中從指定源點到其餘各頂點的最短路徑的問題,通常稱為單源

Dijkstra演算法--有向網路路徑

單源最短路徑問題是:對於給定的有向網路G=(V,E)及單個源點v,求v到G的其餘各頂點的最短路徑。 演算法的基本思想 a.初始時,S只包含源點,即S={v},v的距離為0。U包含除v外的其他頂點,即:U={其餘頂點},若v與U中頂點u有邊,則<u,v>

Dijkstra演算法--無向網路路徑

與有向網路不同的是,無向網路的鄰接矩陣是對稱的,所以在構造鄰接矩陣的時候要注意。Dijkstra演算法的具體內容參照我上次寫的迪傑斯特拉(Dijstra)演算法——有向網路最短路徑 下面直接放程式碼和例項,以便更加理解使用。 #include<stdio.

【圖】路徑Dijkstra演算法

網圖和非網圖中,最短路徑的含義不同: 非網圖中,因為沒有邊上的權值,最短路徑指的是兩頂點之間經過的邊數最少的路徑; 網圖中,最短路徑指的是兩頂點之間經過的邊上權值之和最少的路徑,並且稱路徑上的第一個

路徑問題---dijkstra演算法

理解最短路徑——迪傑斯特拉(dijkstra)演算法 1.       迪傑斯特拉演算法簡介  迪傑斯特拉(dijkstra)演算法是典型的用來解決最短路徑的演算法,也是很多教程中的範例,由荷蘭電腦科學家狄克斯特拉於1959年提出,用來求得從起始點到其他所有點最短路徑

dijkstra演算法計算兩個地鐵站短距離

private static HashMap<station> resultMap = new HashMap<>();//結果集   private static List<station> analysisList = new Arra

Dijkstra演算法 Java實現

基本思想      通過Dijkstra計算圖G中的最短路徑時,需要指定起點vs(即從頂點vs開始計算)。      此外,引進兩個集合S和U。S的作用是記錄已求出最短路徑的頂點,而U則是記錄還未求出最短路徑的頂點(以及該頂點到起點vs的距離)。      初始時,

數據結構 - 路徑Dijkstra算法詳解(Java)

previous 代碼 map class matrix () count 就是 可能   給出一個圖,求某個端點(goal)到其余端點或者某個端點的最短路徑,最容易想到的求法是利用DFS,假設求起點到某個端點走過的平均路徑為n條,每個端點的平均鄰接端點為m,那求出這個最短

路徑算法——Dijkstra

graph 就是 print 偽代碼 c語言程序 距離 oid 很大的 全部 算法思想 設G=(V,E)是一個帶權有向圖 把圖中頂點集合V分成兩組 第一組為已求出最短路徑的頂點集合(用S表示,初始時S中只有一個源點,以後每求得一條最短路徑 , 就將加入到集合S中,直到全部

圖|路徑——(Dijkstra)弗洛伊德(Floyd)

最短路徑——迪傑斯特拉(Dijkstra)弗洛伊德(Floyd) 一、迪傑斯特拉演算法(Dijkstra) 1. 問題: 求從每個源點到其餘各頂點的最短路徑。 2.儲存結構: 1)圖的儲存結構: 帶權的鄰接矩陣 2)輔助陣列: 一維陣列dist:dist[ i ]表示

路徑演算法和弗洛伊德演算法實現

迪傑斯特拉演算法: 矩陣二位陣列矩陣T儲存頂點vi到各頂點的最短路徑值,初始狀態為鄰接頂點為弧的權值,非鄰接頂點為無窮大。陣列S用於儲存最短路徑,儲存單元為該弧的前驅頂點的下標和與前驅頂點之間的弧的權值。 1.從T中找出一條弧值最小的弧(vi,vj),將該弧加入S中,並根據vj的鄰接點vx更

路徑演算法Python實現

回顧下最短路徑的地傑斯特拉演算法 迪傑斯特拉演算法是求從某一個起點到其餘所有結點的最短路徑,是一對多的對映關係,是一種貪婪演算法 示例: 演算法實現流程思路: 迪傑斯特拉演算法每次只找離起點最近的一個結點,並將之併入已經訪問過結點的集合(以防重複訪問,陷入死迴圈),然後

路徑 演算法的簡易實現 大話資料結構 P261改編

對應圖 #include<stdio.h> #define big 65530 #define max 100 int path[max]={0}; int shortpath[max]={0}; typedef struct Node{ c

經典演算法——Dijkstra路徑

基本思想 迪傑斯特拉演算法是由荷蘭電腦科學家狄克斯特拉於1959 年提出的,因此又叫狄克斯特拉演算法。是從一個頂點到其餘各頂點的最短路徑演算法,解決的是有向圖中最短路徑問題。迪傑斯特拉演算法主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。

資料結構圖之三路徑--演算法

1 #include <iostream> 2 #include "SeqList.h" 3 #include "Stack.h" 4 #include <iomanip> 5 using namespace std; 6 7 #defin

路徑演算法(Dijkstra),用c語言實現

首先,迪傑斯特拉演算法是用來解決單源最短路經問題的,主要是通過邊的鬆弛來實現。 我們來看這個問題: 這個問題求得是從1號頂點到達所有其他頂點的最短距離,我們用鄰接矩陣來儲存這個圖,如下: 我們用一個dis陣列來儲存從一號頂點到其他各個頂點的初始路徑,如圖