dijkstra(迪傑斯特拉)演算法是典型的最短路徑路由演算法,用於計算乙個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。
dijkstra演算法
能得出最短路徑的最優解,但由於它遍歷計算的節點很多,所以效率低。
dijkstra演算法是很有代表性的最短路演算法,在很多專業課程中都作為基本內容有詳細的介紹,如資料結構,圖論,運籌學等等。
其基本思想是,設定頂點集合s並不斷地作貪心選擇來擴充這個集合。乙個頂點屬於集合s當且僅當從源到該頂點的最短路徑長度已知。
初始時,s中僅含有源。設u是g的某乙個頂點,把從源到u且中間只經過s中頂點的路稱為從源到u的特殊路徑,並用陣列dist記錄當前
每個頂點所對應的最短特殊路徑長度。dijkstra演算法每次從v-s中取出具有最短特殊路長度的頂點u,將u新增到s中,同時對陣列dist作必要的修改。一旦s包含了所有v中頂點,dist就記錄了從源到所有其它頂點之間的最短路徑長度。
例如,對下圖中的有向圖,應用dijkstra演算法
計算從源頂點1到其它頂點間最短路徑的過程列在下表中。
dijkstra演算法的迭代過程:
#define vertexnum 7 //實際上共有六個頂點(1---6)
#define edgenum 9
int graph[vertexnum][vertexnum] =
//0 1 2 3 4 5 6
;int visited[vertexnum];
int path[vertexnum];
int distance[vertexnum];
void dijkstra(int begin)
visited[vertex] = 1;
printf("s:%d",edges);
for(j=1; j
以上**參考了資料結構課本
下面的是網上的**:
以下是具體的實現(c/c++):
/***************************************
* about: 有向圖的dijkstra演算法實現
* author: tanky woo
* blog: www.wutianqi.com
***************************************/
#include using namespace std;
const int maxnum = 100;
const int maxint = 999999;
void dijkstra(int n, int v, int *dist, int *prev, int c[maxnum][maxnum])
dist[v] = 0;
s[v] = 1;
// 依次將未放入s集合的結點中,取dist最小值的結點,放入結合s中
// 一旦s包含了所有v中頂點,dist就記錄了從源點到所有其他頂點之間的最短路徑長度
for(int i=2; i<=n; ++i)
int main()
}for(int i=1; i<=n; ++i)
dist[i] = maxint;
for(int i=1; i<=n; ++i)
dijkstra(n, 1, dist, prev, c);
// 最短路徑長度
cout << "源點到最後乙個頂點的最短路徑長度: " << dist[n] << endl;
// 路徑
cout << "源點到最後乙個頂點的路徑為: ";
searchpath(prev, 1, n);
}輸入資料:57
1 2 10
1 4 30
1 5 100
2 3 50
3 5 10
4 3 20
4 5 60
輸出資料:
999999 10 999999 30 100
10 999999 50 999999 999999
999999 50 999999 20 10
30 999999 20 999999 60
100 999999 10 60 999999
源點到最後乙個頂點的最短路徑長度: 60
源點到最後乙個頂點的路徑為: 1 -> 4 -> 3 -> 5
最後給出兩道題目練手,都是直接套用模版就ok的:
1.hdoj 1874 暢通工程續
2.hdoj 2544 最短路
最短路徑之Dijkstra演算法 C語言實現
dijkstra演算法 單源點路徑演算法,要求 圖中不存在負權值邊 步驟 a.初始時,s只包含源點,即s v的距離為0。u包含除v外的其他頂點,即 u 若v與u中頂點u有邊,則u的距離設定為相應的權值,若u v之間不存在邊,則 設定u的距離為無窮大。b.從u中選取乙個距離 v 最小的頂點k,把k,加...
c語言實現磁碟排程演算法 C語言實現洗牌演算法
首先看一道題目 有乙個大小為100的陣列,裡面的元素是從 1 到 100,隨機從陣列中選擇50個不重複數。用math.random 100,就可以拿到乙個 0 到 99 的隨機數,是不是重複50次就可以了?當然不是,假如,第一次隨機到5,第二次如果再一次隨機到5的話,要求是選擇不重複的數,所以要選出...
Dijkstra蒜法 C語言實現(鄰接表)
dijstra,求解單源最短路徑問題,解決乙個頂點到其它所有頂點的最短路徑,但是無法求解權值為負數的情況 負權值可考慮使用spfa 是一種基於bfs 廣度優先 從起點開始,一層層向外拓展,逐步更新資料,直到拓展到終點為止。初始有s,u兩個集合,s記錄已經求出最小值的頂點,u記錄還未求出最小值的頂點,...