本文實現的dijkstra演算法是最簡單的方法,就是暴力搜尋,其時間複雜度為o(v^2),後面會使用優先佇列的方法,修改廣度優先遍歷來實現dijkstra演算法,這樣的演算法時間複雜度上會有所改善。
**例項:
/* 參考文獻: 演算法流程: 在以下說明中,s為源,w[u,v]為點u和v之間的邊的長度,結果儲存在dist 1.初始化:源的距離dist[s]設為0,其他的點距離設為無窮大,同時把所有的點的狀態設為沒有擴充套件過。 2.迴圈n-1次: 在沒有擴充套件過的點中取一距離最小的點u,並將其狀態設為已擴充套件。 對於每個與u相鄰的點v,執行relax(u,v),也就是說,如果dist[u]+w[u,v]#include#include#includeusing namespace std; const int maxnum=1000000; //邊權最大值 int n; //節點數目 int dist[501]; //到節點1的最短路徑值 bool state[501]; //節點被搜尋過狀態指示 int data[501][501]; //鄰接矩陣 //查詢權值最小的節點 int findmin() //初始化 for(int i=1; i<=n; i++) state[1]=true; int done=1; while (donedist[node]+data[node][i]) && (!state[i])) dist[i]=dist[node]+data[node][i]; } else break; } } int main() { dijkstra(); for(int k=1; k<=n; k++) { if (dist[k]==maxnum) cout<<-1; else cout《修改部分:
輸出了過程中dist[i]的變化
因此分以下幾步完成:
1.dist[i]用於標記從s到i的最短路徑,初始化是只有dist[s]=0,其他dist[i]=maxweitht,表示權值無窮大
2.因為源點已經找到,還需要遍歷剩餘的v-1個點來找尋最短路徑。
3.從dist[i]中找尋i點沒有被訪問且dist最小的值作為下乙個頂點minnode。
4.如果dist[minnode]的值加上其可達頂點j的邊上的值小於dist[j]的值,則更新dist[j],表明j的前序節點是minnode。
Dijkstra演算法求單源最短路徑
與prim演算法樸素版實現起來差不多。樸素版dijkstra演算法 輸入乙個圖的矩陣,假定兩點不相鄰則權值為0 輸出每個頂點的最短路徑長度,可以列印指定頂點的路徑 dijkstra演算法跟prim演算法很像 相同的地方是 兩者都有乙個已經求得 mst 和已經求得 最短路 的集合 每納入乙個結點x到集...
Dijkstra演算法求單源最短路徑
dijkstra演算法求單源最短路徑 include include define vexsize 100 建立鄰接矩陣 int creat int cost vexsize return vexnum dijkstra演算法 void dijkstra int cost vexsize int v...
Dijkstra演算法(求單源最短路徑)
dijkstra演算法 原鏈結 1.定義概覽 dijkstra 迪傑斯特拉 演算法是典型的單源最短路徑演算法,用於計算乙個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。dijkstra演算法是很有代表性的最短路徑演算法,在很多專業課程中都作為基本內容...