Dijkstra算法:
#include <iostream>
using namespace std;
void Matrixgraph::Dijstra(int begin){ //按路徑長度遞增的次序產生最短路徑的算法
int visit[MAX]={0};
int path[MAX],dis[MAX];
for(int i=0;i<vexnum;i++){
dis[i]=edgematrix[begin][i];
path[i]=begin;
}
dis[begin]=0;
visit[begin]=1;
int v=0; //每次求得v0到某個頂點的最短路徑 把v加入到集合
for(int i=0;i<vexnum;i++){
if(i==begin) continue;
int min=INIT;
for(int j=0;j<vexnum;j++){
if(!visit[j]&&dis[j]<min){
min=dis[j];
v=j;
}
} //找出頂點的最短路徑
visit[v]=1; //訪問路徑最短的頂點
for(int j=0;j<vexnum;j++){ //這個頂點直接的下一個和重新開始一條路徑哪個更小
if(!visit[j]&&min+edgematrix[v][j]<dis[j]){
dis[j]=min+edgematrix[v][j];
path[j]=v;
}
}
}
for(int i=0;i<vexnum;i++){
if(i==begin) continue;
int que[MAX]={0};
int index=0;
que[index]=i;
index++;
int temp=path[i];
while(temp!=begin){
que[index]=temp;
index++;
temp=path[temp];
}
que[index]=begin;
cout<<" v"<<begin<<"-> v"<<i<<": ";
for(int j=index;j>0;j--)
cout<<data[que[j]]<<"->";
cout<<data[que[0]]<<" 路徑長度爲: "<<dis[i]<<endl;
}
}