(二)Dijkstra演算法

2021-06-14 11:36:38 字數 2023 閱讀 4143

#ifndef _dijkstra_

#define _dijkstra_

#include using namespace std;

void testdijstra();

const int max_node = 1000;

/* 最簡單的:用二維陣列來記錄graph和weight

斐波那契堆實現:insert,get

1.最普通實現

2.使用二叉堆實現

3.實現fibonacci堆,進而用其實現

*/// 用二維陣列來記錄graph和weight

// graph[i][j] 從i到j是否有路徑:如果為0,沒有;>0,有!

void dijstra1(int graph[max_node], int size, int start, int *dist, int *prev);

// 從陣列中找到最小值的索引,只查詢bool值為false的

int findminfromarr(int *arr, int size, bool *used);

void elasped(int graph[max_node], int size, int *dist, int *prev, int tmp, bool *used);

// 列印結果:從s->t的路徑

void printpath(int *prev, int size, int s, int t);

// 用最小堆實現

/* 最小堆實現:用指標實現

指標實現似乎不太方便

之所以不方便是因為parent指標不好定位!!!

*/struct heapnode

};void insertheapnode(heapnode *head, heapnode *node);

heapnode *deletemin(heapnode *head);

// 用二叉堆實現

void dijstra2(int graph[max_node], int size, int start, int *dist, int *prev);

#endif

#include "2_dijkstra.h"

void testdijstra()

void dijstra1(int graph[max_node], int size, int start, int *dist, int *prev)

// 首先初始化與start相連的

for (int i = 0; i < size; ++i) }

// 由於一共有size個節點,因此要迴圈size-1次

for (int i = 1; i < size; ++i)

delete used;

}int findminfromarr(int *arr, int size, bool *used)

} return index;

}void elasped(int graph[max_node], int size, int *dist, int *prev, int tmp, bool *used)

} }}// 遞迴實現

void printpath(int *prev, int size, int s, int t)

printpath(prev, size, s, prev[t]);

cout << t << " ";

}void insertheapnode(heapnode *head, heapnode *node)

heapnode *deletemin(heapnode *head)

void dijstra2(int graph[max_node], int size, int start, int *dist, int *prev)

heapnode *root = null;

for (int i = 0; i < size; ++i)

else

} }}

最短路徑演算法之二 Dijkstra演算法

dijkstra演算法 dijkstra演算法主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。注意該演算法要求圖中不存在負權邊。首先我們來定義乙個二維陣列edge maxn maxn 來儲存圖的資訊。這個圖的edge 陣列初始化以後為 我們還需要用乙個一維陣列dis 來儲存1 號頂...

演算法 Dijkstra演算法筆記

參考文章 隨記參考邏輯 dijkstra演算法採用的是一種貪心的策略。演算法的基本思想是 通過不斷更新的距離陣列,每次從距離陣列找到離源點最近的乙個且沒有掃瞄過的節點,然後以該頂點為中心進行bfs擴充套件,直到所有節點都掃瞄一遍,最終得到源點到其餘所有點的最短路徑 1 起點固定,若要記錄到達路徑,則...

日日演算法 Dijkstra演算法

dijistra演算法作為一種最短路徑演算法,可以用來計算乙個節點到圖上其他節點的最短距離。主要是通過啟發式的思想,由中心節點層層向外拓展,直到找到中點。適用於無向圖和有向圖。假設我們要計算節點a到其它節點的最短距離 引入兩個集合 s,u 其中集合s表示已經求出最短路徑的點 以及最短距離 集合u表示...