1. 程式人生 > >Dijkstra演算法實現——————資料結構作業

Dijkstra演算法實現——————資料結構作業

  • 鄰接矩陣存圖
  • 輸入頂點個數n,邊的個數m
  • 輸入m條邊
  • 輸入起點v0\ v_0 和終點v\ v
  • 輸出最短路徑及路徑長度
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>

using namespace std;

const int MaxInt = 32767;//INF
const int MVNum  = 1e2+7;//最大頂點數
typedef char VerTexType;
typedef int  ArcType;
typedef struct
{ VerTexType vexs[MVNum]; ArcType arcs[MVNum][MVNum]; int vexnum,arcnum; }AMGraph; bool S[MVNum];//記錄源點v0到終點vi是否已被確定的最短路徑長度,true 表示確定,false表示尚未確定 int D[MVNum];//記錄源點v0到終點vi的當前最短路徑長度,D[i]需要初始化 int Path[MVNum]; int GreateUDN(AMGraph &G) { cout<<"請輸入總的頂點數和總邊數:\n"; cin>>
G.vexnum>>G.arcnum;//輸入總頂點數,總邊數 /* for(int i=0;i<G.vexnum; ++i)//輸入點的資訊,不過這個沒有用上 cin>>G.vexs[i]; */ cout<<"請輸入"<<G.arcnum<<"條邊:"<<endl; for(int i=0; i<=G.vexnum; ++i) for(int j=0;j<=G.vexnum;++
j) G.arcs[i][j]=MaxInt; for(int k=0; k<G.arcnum; ++k)//構造鄰接矩陣 { int v1,v2,w; cin>>v1>>v2>>w; G.arcs[v1][v2] = G.arcs[v2][v1] = w; } return 1; } void ShortestPath_DIJ(AMGraph G,int v0)//用Dijkstra演算法求單源最短路 { int n = G.vexnum;// n 為G中頂點的個數 for(int v = v0; v<=n; ++v)//n 個定點依次初始化 { S[v] = false;//S初始是空集 D[v] = G.arcs[v0][v];// if(D[v] < MaxInt) Path[v] = v0; else Path[v] = -1; } S[v0] = true; D[v0] = 0; int v; for(int i=1; i<=n; ++i) { int minn = MaxInt; for(int w=0; w<=n; ++w) if(!S[w] && D[w] < minn) { v = w; minn = D[w]; } S[v] = true; for(int w=0; w<=n; ++w) if(!S[w] && (D[v] + G.arcs[v][w] < D[w])) { D[w] = D[v] + G.arcs[v][w]; Path[w] = v; } } } int main() { AMGraph G; GreateUDN(G); int v0,v=5; printf("請輸入起點和終點:"); scanf("%d %d",&v0,&v); ShortestPath_DIJ(G,v0); printf("%d\n",D[v]); for(int i=v;~i; i=Path[i]) { if(i != v) printf("<-"); printf("%d",i); } puts(""); return 0; }