資料結構 迪傑斯特拉演算法基礎 模板

2021-09-10 18:17:00 字數 2205 閱讀 9533

dijkstra演算法用來解決單源最短路徑問題,即給定圖g和起點s,通過演算法就可以得到s到達其他每個頂點的最短路徑。

比如下面這張圖中,求得了某個結點到達其他各個結點的最短路徑

演算法的具體步驟如下:

我們定義帶權圖g所有頂點的集合為v,接著我們再定義已確定最短路徑的頂點集合為u,初始化集合u為空。然後執行下面操作

1.首先我們將起點x加入集合u,並在陣列a中記錄起點x到各個點的最短路徑(如果頂點到起點x有直接相連的邊,則最短路徑為邊權值,否則為乙個極大值),並設定起點被訪問

2.從陣列a中選擇乙個距離起點x最近的未被訪問的結點v該節點不屬於集合u(如果存在多個這樣的點,任選乙個即可。將頂點v加入集合u,並更新所有與頂點v相連頂點的最短路徑,設定該節點被訪問。

3.重複第二部操作,直至集合u等於集合v(即所有頂點被訪問)

為了能更好地理解這個演算法,我們通過舉例並一步一步地來模擬實現

首先我們將除起點外的所有結點距離設定為無窮大,起點位置距離設定為0

設定該節點被訪問,然後開放這個結點到其他結點的邊,根據邊權更新路徑

然後選出距離v0最近的那個結點(這裡是v1),遍歷到該節點,開放v1到其他結點的邊

然後進行比較:如果v1的距離+邊權比v1連線的結點的距離更小,那麼更新那個點的距離為v1的距離+邊權

比如下圖中,v3原本的值是4,但v1的距離+邊權=3,比v3的距離小,這時,更新v3的距離為3

重複上述操作,直到所有的結點都被訪問為止,此時,每個結點的距離都是到v0的最短距離

演算法模板如下:一般使用鄰接矩陣實現

切記:1.鄰接矩陣,最短距離陣列和bool陣列一定要初始化

2.初始化最短距離陣列後,起點位置的距離要先賦值為0(如果有別的點權,也要先賦值)

#include #include #include using namespace std;

const int maxv = 201;

const int inf = 0x3fffffff;

//鄰接矩陣版本

int n, m, s;

int g[maxv][maxv];

int d[maxv]; //各個點到出發點的最短路徑

bool vis[maxv] = ;

//並查集輸出最短路徑

int f[maxv];

void dijkstra(int s)

} if (u == -1) return; //所有邊訪問完成,演算法完成,退出

//更新每個結點的最小距離

vis[u] = true; //設定本結點為訪問結點

for (int v = 0; v < n; ++v)

} }}void getroute(int e)

}int main()

scanf("%d %d %d", &n, &m, &s);

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

dijkstra(s); //起始點

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

system("pause");

return 0;

}

迪傑斯特拉演算法 資料結構

dijkstra 迪傑斯特拉 演算法是典型的最短路徑路由演算法,用於計算乙個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。dijkstra演算法 能得出最短路徑的最優解,但由於它遍歷計算的節點很多,所以效率低。dijkstra演算法是很有代表性的最短...

迪傑斯特拉演算法

if object id t test is not null drop table t test gocreate table dbo t test id int identity 1,1 not null primary key,自增字段,無意義 header varchar 500 第一點的名...

迪傑斯特拉演算法

dijkstra 迪傑斯特拉 演算法是典型的最短路徑路由演算法,用於計算乙個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。dijkstra演算法 能得出最短路徑的最優解,但由於它遍歷計算的節點很多,所以效率低。dijkstra演算法是很有代表性的最短...