圖論無權路徑算法實現



查看原文:http://www.wyblog.cn/2016/12/07/%e5%9b%be%e8%ae%ba%e6%97%a0%e6%9d%83%e8%b7%af%e5%be%84%e7%ae%97%e6%b3%95%e5%ae%9e%e7%8e%b0/

算法思想參考《數據結構與算法分析》教材。 與拓撲排序算法一樣,首先使用鄰接表實現DAG圖,無權路徑實際上就是路徑權值爲1的圖。 對於每一個頂點,記錄從其他頂點到此頂點的最短路徑長度,用變量dist表示,進一步,再記錄下到達此頂點的上一個頂點的值是多少。 數據結構上採用隊列實現,實際就是一次廣度優先搜索。具體見代碼:


#include<cstdio> #include<iostream> #include<queue> using namespace std; #define MAX_VERTEX_NUM 100 #define Vertextype int #define Infinity 0xffff typedef struct EdgeNode { int adjVertex; EdgeNode *nextEdgeNode; }EdgeNode; typedef struct VerNode { Vertextype data; int dist; Vertextype path; EdgeNode *firstedge; }VerNode; typedef struct Graph { VerNode verNode[MAX_VERTEX_NUM]; int vertex_num,edge_num; }Graph; void CreateDAG(Graph &G,int n,int e) { int i,j,k; G.vertex_num=n; G.edge_num=e; for(i=1;i<=n;i++) { cin>>G.verNode[i].data; G.verNode[i].dist=Infinity; G.verNode[i].path=0; G.verNode[i].firstedge=NULL; } for(k=1;k<=e;k++) { EdgeNode *p; p=new EdgeNode; cin>>i>>j; p->adjVertex=j; p->nextEdgeNode=G.verNode[i].firstedge; G.verNode[i].firstedge=p; } } void Unweighted(Graph &G,int n) { queue<VerNode> Q; VerNode V; EdgeNode *w; G.verNode[n].dist=0; //起點處路徑長度置爲0 Q.push(G.verNode[n]); while(!Q.empty()) { V=Q.front();Q.pop(); w=V.firstedge; while(w) { if(G.verNode[w->adjVertex].dist==Infinity) { G.verNode[w->adjVertex].dist=V.dist+1; G.verNode[w->adjVertex].path=V.data; Q.push(G.verNode[w->adjVertex]); } w=w->nextEdgeNode; } } } int main() { int i; Graph G; CreateDAG(G,7,12); //給出圖的頂點數及邊數量 Unweighted(G,3); //指出起點 for(i=1;i<=7;i++) printf("%d ",G.verNode[i].path); //打印路徑 } /*****測試數據 1 2 3 4 5 6 7 3 1 3 6 1 2 1 4 2 4 2 5 4 3 4 5 4 6 4 7 5 7 7 6 *******/


查看原文:http://www.wyblog.cn/2016/12/07/%e5%9b%be%e8%ae%ba%e6%97%a0%e6%9d%83%e8%b7%af%e5%be%84%e7%ae%97%e6%b3%95%e5%ae%9e%e7%8e%b0/
發佈了84 篇原創文章 · 獲贊 26 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章