Dijkstra演算法實現——————資料結構作業
阿新 • • 發佈:2018-12-21
- 鄰接矩陣存圖
- 輸入頂點個數n,邊的個數m
- 輸入m條邊
- 輸入起點 和終點
- 輸出最短路徑及路徑長度
#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;
}