Dijkstra演算法的實現

2021-07-30 20:23:57 字數 3616 閱讀 3301

最近自學了dijkstra演算法,跟著自己的理解寫了個**,想加深對dijkstra演算法的理解,如有不足,還請多多指教。

首先,dijkstra演算法主要是適用於找兩點之間的最小權值之和。

思路:

開始的時候,假設有兩個集合(分別為a,b集合),a集合為空(用來存放使用過的點),b集合存放著圖中的各點(當然,在寫**的時候不一定要用到集合,能表達這個意思就行),先將起始點(假設為點a)放入a集合中,開始執行的時候,依次遍歷b集合中的元素,查詢a集合中起始點所能到達的在b集合中的點的最短路徑,記錄下最短的路徑,及其所到達的點(假設為點b),之後以b點作為中間點,查詢點b所能到達的點(假設為點c,d),之後比較a到b再到c或d的距離與a到c或a到d的距離,若a經過中間點b再到其它點的距離小於a直接到其它點的距離,則更新a到其它點的距離為a到中間點的距離再到其它點的距離(如:a->b=1,b->c=3,a->c=5,則更新完後a->c=4),迴圈完一次後,將所找到的最小值的點加入到集合a中,之後依次在集合b中重複上述步驟至集合b中的全部元素取出即可。

下面,根據下圖對dijkstra進行分析:

我們下面以求兩點之間的最短路徑為例子:

在上圖中,假設a為起點,f為目標點,要求a到f的最短路徑。

先來看一下**框架:

1.首先先定義兩個結構體,乙個為圖,乙個儲存圖中兩個點之間的權值,及判斷該點是否在集合中。

struct arc_

;struct mgraph

;

2.對圖先進行初始化,初始化時輸入頂點的個數及邊數後,將任意兩點間的距離初始化為無窮大,同時將 is_in_set 全部初始化為true,初始化完成後輸入資料,給圖中指定兩點賦值。

3.對圖設定完之後開始dijkstra演算法,先將起始點加入到集合a中(及將起止點的 is_in_set 置為false),開始在b集合中迴圈,依次找到最小的點,詳情見上面的思路,接下來貼**:

//----------------begin-----------------//

for (v = 0; v < g->vertax; v++)//第乙個迴圈作為次數控制

}g->arc[v0][min_j].is_in_set = false;//接下來的迴圈中min_j將被走過,故為false

g->arc[min_j][v0].is_in_set = false;

for (x = 0; x < g->vertax; x++)

}}//-------------------------end----------------------

最後的執行如下圖所示:

最後貼上全**:

/*

name:dijkstra演算法

author :bby

time:2017.4.19

language:c++

*/#include

#include

using

namespace

std;

const

int maxnum = 100;

const

int max_int = 999999;

struct arc_

;struct mgraph

;int dijkstra(mgraph *, int, int);

void init(mgraph *);//對圖進行初始化

void input(int&, int&, int&);//對圖進行賦值

void print_g(mgraph*, mgraph*);//輸出圖

void copy_g(mgraph*, mgraph*);//複製圖的路徑長度

bool is_equal(mgraph*, mgraph*);//判斷兩個圖是否相等

//測試函式

int main()

//對圖進行初始化

void init(mgraph*g)

catch (int)

while (!cin.good());

init(g);

}for (int i = 0; i < g->vertax; i++)//初始化圖全部為無窮

for (int j = 0; j < g->vertax; j++)

int i, j, value;

for (int k = 1; k <= g->arcnum; k++)

cout

<< "初始化完成!"

<< endl << endl;

}//對圖進行賦值

void input(int&i, int&j, int&value)

catch (int)

while (!cin.good());

input(i, j, value);

}}//dijkstra演算法

int dijkstra(mgraph *g, int v0, int v1)

}g->arc[v0][min_j].is_in_set = false;//接下來的迴圈中min_j將被走過,故為false

g->arc[min_j][v0].is_in_set = false;

for (x = 0; x < g->vertax; x++)

}if (!is_equal(g, before_g))

}//-------------------------end----------------------

//釋放記憶體

delete before_g;

return g->arc[v0][v1].value;

}//輸出圖

void print_g(mgraph*g, mgraph*before_g)

else

}else

else}}

cout

<< endl << endl;

}}//複製圖的路徑長度

void copy_g(mgraph*g, mgraph*before_g)

//判斷兩個圖是否相等

bool is_equal(mgraph*g, mgraph*before_g)

Dijkstra演算法的實現

dijkstra演算法的實現 讀入 dijkstratxt 中的部分網路資料 test.txt 弧段起點id,弧段終點id,弧段距離 用dijkstra演算法生成的最佳路徑再寫入 routetxt.txt 檔案中 include include include include using names...

dijkstra演算法實現

include include using namespace std const int maxnum 100 const int maxint 999999 各陣列都從下標1開始 int dist maxnum 表示當前點到源點的最短路徑長度 int prev maxnum 記錄當前點的前乙個結...

Dijkstra演算法java實現

看到網上的dijkstra演算法寫的都好複雜,我自己就簡單的寫了乙個,例子為書上的例子。public class dijkstra 存放的為頂點所在陣列的id和頂點名稱 mapv new hashmap 不存放源點 v0 v.put 1,v1 v.put 2,v2 v.put 3,v3 v.put ...