#include <iostream>
#include <stack>
using namespace std;
const int MAX = 65535;
const int graph[9][9] = {
//v: 0 1 2 3 4 5 6 7 8 V:
{ 0, 1, 5,MAX,MAX,MAX,MAX,MAX,MAX}, //0
{ 1, 0, 3, 7, 5,MAX,MAX,MAX,MAX}, //1
{ 5, 3, 0,MAX, 1, 7,MAX,MAX,MAX}, //2
{MAX, 7,MAX, 0, 2,MAX, 3,MAX,MAX}, //3
{MAX, 5, 1, 2, 0, 3, 6, 9,MAX}, //4
{MAX,MAX, 7,MAX, 3, 0,MAX, 5,MAX}, //5
{MAX,MAX,MAX, 3, 6,MAX, 0, 2, 7}, //6
{MAX,MAX,MAX,MAX, 9, 5, 2, 0, 4}, //7
{MAX,MAX,MAX,MAX,MAX,MAX, 7, 4, 0} //8
};
int main(){
int dist[9] = {0,1,5,MAX,MAX,MAX,MAX,MAX,MAX};
int path[9] = {0};
bool collected[9] = {false,false,false,false,false,false,false,false,false};
int final[9] = {1,0,0,0,0,0,0,0,0};//收录集合
int min,w,k;
//开始主循环,每次求得Vo到某个V顶点的最短路径
for(int i = 1;i<9;i++){
min = MAX;
//寻找距离VO最近的顶点
for(w=0;w<9;w++){
if(!final[w] && dist[w] < min){
k=w;
min = dist[w];
}
}
cout<<"收录的顶点:"<<k<<endl;
final[k] = 1;//将目前找到的最近的顶点设置为1
for(w=0;w<9;w++){//修正当前最短路径以及距离
if(!final[w] && (min+graph[k][w] < dist[w])){
dist[w] = min + graph[k][w];
cout<<"更新顶点 w:"<<w<<",距离:"<<dist[w]<<endl;
path[w] = k;
cout<<"路径顶点:"<<path[w]<<endl;
}
}
}
for(int i:path){
cout<<"i:"<<i<<'\t';
}
cout<<endl;
for(int i:dist){
cout<<"i:"<<i<<'\t';
}
//下面输出V0-V8之间的路径:,V0到其他定点路径同理
int node_index = 8;//V8的下标
stack<int> route;
cout<<endl;
while(path[node_index] != 0){//前驱不是0则继续
route.push(path[node_index]);
node_index = path[node_index];
}
cout<<endl<<"V0->V8 node:0";
int size = route.size();
for(int i=0;i<size;i++){
cout<<" -> "<<route.top();
route.pop();
}
return 0;
}
最短路Dijkstra算法
最新推荐文章于 2016-08-27 09:35:30 发布