生活随笔
收集整理的這篇文章主要介紹了
图的单源最短路径:Dijkstra算法实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
? ? ? ? 本文介紹的是圖的非負權值的單源最短路徑問題。問題的提出是,對于有權圖D,t提供源點v,要找到從v到其他所有點的最短路徑,即單源最短路徑問題,在本文中,解決這一問題,是普遍比較熟悉的Dijkstra算法。
? ? ? ? 算法核心思想參見維基。簡而言之,設集合S存放已經求出了最短路徑的點。初始狀態S中只有一個點v0,之后每求得v0到vn的最短路徑,就會更新v0到所有vn鄰接的點的一致的最短路徑(不一定是最終的最短路徑),如此重復,每次會確定v0到一個點的最短路徑,確定好的點加入S中,直至所有點進入S結束。在本文中通過visited這一數組來標記相應點是否已經加入S。
? ? ? ? 以下是代碼實現,供參考。其中圖的相關部分參見C++ 圖的實現:
/*
*單源最短路徑:Dijkstra算法
*----By F8Master
*/#include "Graphmtx.h"
#include<stack>
#include<iostream>
using namespace std;#define DEFAULTPRE '&' //用于標記template<class T,class E>
void Dijkstra(Graphmtx<T,E> &G, E *dist, T *pre, T &s)//G為存儲的圖,dist是距離數組,pre是其路徑中前一個點,s為源點
{int numVertex = G.NumberOfVertices();bool *visited = new bool[numVertex];//標志有木有確定最小距離for (int i =0;i<numVertex;i++)//初始化{ dist[i] = G.getWeight(G.getVertexPos(s),i);if (dist[i]>0 && dist[i]<INF)pre[i] = s;else pre[i] = DEFAULTPRE;}pre[G.getVertexPos(s)] = s;for(int i =0;i<numVertex;i++){visited[i] = false;}int n= G.getVertexPos(s);visited[n] = true;for(int i=1;i<numVertex;i++)//每次找一個點,要找numVertex-1次{E min = INF;int u = -1;for(int j=0;j<numVertex;j++) //找一個距離最小的點{if(visited[j]==false && dist[j]<min){u = j;min = dist[j]; }}if(u > 0){visited[u]=true;for(int k = 0;k<numVertex;k++){if(visited[k]==false && dist[u]+G.getWeight(u,k)<dist[k]){dist[k] = dist[u]+G.getWeight(u,k);pre[k] = G.getValue(u);}}} }}template<class T,class E >
void showPath(Graphmtx<T,E> &G,T *pre,T &end,T &start)
{stack<T> s;if(end!=start){T v = end;while(v!=start){s.push(v);v = pre[G.getVertexPos(v)];}s.push(v);while(!s.empty()){cout<<s.top()<<" ";s.pop();}}
};
//測試代碼
void test_Dijkstra()
{Graphmtx<char,int> G;//T為char,E為intG.inputGraph();int *dist= new int[G.NumberOfVertices()];char *pre = new char[G.NumberOfVertices()];char start;cout<<"輸入源點:";cin>>start;Dijkstra(G,dist,pre,start);for(int i = 0;i<G.NumberOfVertices();i++){char end = G.getValue(i);if(end!=start){showPath(G,pre,end,start);cout<<dist[i]<<endl;} }
}對于下圖,進行測試:
轉載于:https://www.cnblogs.com/f8master/p/3826065.html
總結
以上是生活随笔為你收集整理的图的单源最短路径:Dijkstra算法实现的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。