單源最短路徑

2021-07-17 03:26:59 字數 1761 閱讀 4396

單源最短路徑問題,即在圖中求出給定頂點到其他任一頂點的最短路徑。

1.最短路徑的最優子結構性質

該性質描述為:如果p(i, j) = 是從頂點i到j的最短路徑,k和s是這條路徑上的乙個中間頂點,那麼p(k, s)必定是從k到s的最短路徑。

證明:假設p(i, j) = 是從頂點i到j的最短路徑,則有p(i, j) = p(i, k) + p(k, s) + p(s, j)。如果p(k, s)不是從k到s的最短距離,那麼必然存在另一條從k到s的最短路徑p'(k, s),那麼p'(i, j) = p(i, k) + p'(k, s) + p(s, j) < p(i, j)。則與p(i, j)是從i到j的最短路徑相矛盾。因此該性質得證。

2.dijkstra演算法

由上述性質可知,如果存在一條從i到j的最短路徑, vk是vj前面的乙個頂點。那麼(vi ... vk)也必定是從i到k的最短路徑。

為了求出最短路徑,dijkstra就提出了以最短路徑長度遞增,逐次生成最短路徑的演算法。比如對於源頂點v0,首先選擇其直接相鄰的頂點中長度最短的頂點vi,那麼當前已知可得從v0到達vj頂點的最短距離dist[j] = min。

根據這種思路:

假設存在g = ,源頂點為v0, u = , dist[i]記錄v0到i的最短距離,path[i]記錄從v0到i路徑上的i前面的乙個頂點。

(1)從v-u中選擇使dist[i]值最小的頂點i,將i加入到u中;

(2)更新與i直接相鄰頂點的dist值(dist[j] = min)

(3)直到u=v,停止。

示例**:

//// in practice, you should use the sta***ard input/output

// in order to receive a score properly.

// do not use file input and output. please be very careful.

#include #include #include #define m 100

#define n 100

using namespace std;

typedef struct node

mgraph;

void dijkstrapath(mgraph g, int* dist, int* path, int v0)

if (g.matrix[v0][i] > 0)

else

visited[i] = false;

} for (i = 1; i < g.n; i++)

}visited[u] = true;

//更新與i直接相鄰頂點的dist值(dist[j] = min)

for (k = 0; k < g.n; k++)

}} delete visited;

}//列印最短路徑上的各個頂點

void printpath(int *path, int v, int v0)

s.push(v);

while (!s.empty()) }

int main(int argc, char** argv)

cin >> v0;

dijkstrapath(g, dist, path, v0);

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

}delete dist;

delete path;

} return 0;//your program should return 0 on normal termination.

}

單源最短路徑

include define max 999 define maxverts 10 typedef struct graph void chushi graph g void dij graph int key,int int int main for i 1 i g.numverts i dij ...

單源最短路徑

最優子結構 最短路徑的子路徑也是最短路徑,動態規劃和貪心演算法的乙個重要指標。環路 一條最短路徑不可能包含環路 1 環路權重為負,如果有一條環路權重為負,則不存在最短路徑 2 環路權重為零,如果包含該環路,則將該環路去掉即可 3 環路權重為正,去掉改環路可以得到更短的路徑,因此不可能是最短路徑 最短...

單源最短路徑

在最短路徑問題中,給定乙個帶權重的有向圖g v,e 和權重函式w e r,該權重函式將每條邊對映到實數值的權重上。圖中一條路徑p v0,v1,vk 的權重w p 是構成該路徑的所有邊的權重之和。定義從結點u到結點v的最短路徑權重 u,v 從結點u到結點v的最短路徑則定義為任何一條權重w p u,v ...