圖論算法(四) Dijkstra算法

代碼

#include <iostream>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;

const int INF = 0x3f3f3f3f;

struct Edge {
    int vertex, weight;
};

class Graph {
private:
    int n;
    vector<Edge> * edges;
    bool * visited;
public:
    int * dist;
    Graph (int input_n) {
        n = input_n;
        edges = new vector<Edge>[n];
        dist = new int[n];
        visited = new bool[n];
        memset(visited, 0, n);
        memset(dist, 0x3f, n * sizeof(int));
    }
    ~Graph() {
        delete[] dist;
        delete[] edges;
        delete[] visited;
    }
    void insert(int x, int y, int weight) {
        edges[x].push_back(Edge{y, weight});
        edges[y].push_back(Edge{x, weight});
    }
    void dijkstra(int v) {
        dist[v]=0; //從v出發(fā),首先將v的距離設(shè)置為0(自己到自己)
        for(int i=0;i<n;i++){ //遍歷所有其他結(jié)點
            int min_dist=INF,min_vertex;  //初始化一個最短距離和當(dāng)前距離最短的節(jié)點
            for(int j=0;j<n;j++){
                if(!visited[j]&&dist[j]<min_dist){ 如果當(dāng)前結(jié)點的距離比min_dist小則更新之
                    min_dist=dist[j];
                    min_vertex=j;
                }  
            }
            visited[min_vertex]=1;//標(biāo)記已訪問
            for (Edge& j:edges[min_vertex]){//遍歷min_vertex的每一條邊
                if(min_dist+j.weight<dist[j.vertex]){//如果當(dāng)前的最小距離,加上邊的距離小于j.vertex的距離的話就更新j.vertex的距離——這意味著j.vertex的距離沒那么大
                    dist[j.vertex]=min_dist+j.weight;
                }
            }
        }
        
    }
};

int main() {
    int n, m;
    cin >> n >> m;
    Graph g(n);
    for (int i = 0; i < m; i++) {
        int a, b, c;
        cin >> a >> b >> c;
        g.insert(a, b, c);
    }
    g.dijkstra(0);
    for (int i = 0; i < n; i++) {
        cout << i << ": " << g.dist[i] << endl;
    }
    return 0;
}

Dijkstra算法的思路:
參見代碼注釋

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,045評論 25 709
  • 緣 (文/亦濃) 佛說,歡喜做,甘愿受。 所謂緣分,應(yīng)該是天意的緣,爭取的份。 有了緣,不作為,也不會有份。 想要...
    開在夜里的花兒閱讀 360評論 14 11
  • 幾個小時前你說:“你怕是還是不要來了吧” 從此 生命開始荒蕪 2013年07.16姑且算一個開始吧 分不清,記不起...
    souvenirso閱讀 383評論 11 5
  • 其實看似無堅不摧的人,才最怕受到傷害。他們把所有可能會傷害到自己的人擋在門外,杜絕所有可能傷害到自己的事情發(fā)生。給...
    李子樹在下雪閱讀 337評論 0 0
  • 語言藝術(shù):被劃分為好幾門課,包括閱讀,寫作,拼寫,語法。 數(shù)學(xué):和國內(nèi)的相比起來,教學(xué)范圍是差不多的,但是教學(xué):度...
    杰出道閱讀 797評論 0 0

友情鏈接更多精彩內(nèi)容