您的位置:首页 > 其它

迪杰斯特拉-最短路径算法

2017-05-27 18:45 330 查看


#include <iostream>
#include <string>
#include <stack>
#include <vector>
#include <iomanip>
using namespace std;
//变量
int L[10]={0};//L(i)//记录路径
int exsist[10]={0};//判断点是否存在的集合
int pre[10]={0};//记录前导点
//vector<int> path;//记录最短路径结点//后来发现思路不对//每次记录min点会出现不连续的路径
int jiedian;//结点个数//从V1开始
//变量

//判断点是否存在
bool ifexsist(int exsist[10],int judgepoint){
if(exsist[judgepoint]==1) return 1;
else return 0;
}
//找出min(L(i))
int minLi(int L[10],int exsist[10]){
int temp;
for(int i = 1;i<=jiedian;i++){
if(exsist[i]==1) {
temp = i;
break;
}//min赋初值
}
int min=temp;
for(int i = 1; i <=jiedian; i++){
if((exsist[i]==1) && (L[i]<L[min])){
min = i;
}
}
return  min;

}

int main()
{

for(int i = 0; i < 10; i++) L[i]=999;
for(int i = 0; i < 10; i++) exsist[i]=1;
cout<<"请输出图中结点个数(<10):";
cin>>jiedian;
int tu[10][10]={0};
cout<<"请输入边和权值,输入0,0,0时结束"<<endl;
int b1=1,b2,q;
while(b1+b2+q){
cin>>b1>>b2>>q;
tu[b1][b2]=q;
//tu[b2][b1]=q;
}
cout<<"图的邻接矩阵如下:"<<endl;

for(int i = 1;i <= jiedian;i++){
cout<<"V"<<i<<"  ";
for(int j=1; j<= jiedian; j++){
cout<<setw(4)<<tu[i][j]<<" ";
}
cout<<endl;
}

int begin,end;//起点和终点
cout<<"输入起点终点"<<endl;
cin>>begin>>end;

L[begin] = 0;

while(1){
int min = minLi(L, exsist);
//出度
if(min == end) break;
for(int m=1; m<=jiedian; m++){
//if(m==min) continue;
if(tu[min][m]!=0){
//先判断临点存在
if(ifexsist(exsist, m)){
int temp = L[min] + tu[min][m];
//替换L
if(temp < L[m]) {
pre[m]=min;
L[m]=temp;
}
}
}

}
//所有临点判断完
exsist[min]=0;
//path.push_back(min);
}
int t = end;
cout<<"最短路径为:"<<endl;
while(1){

cout<<"V"<<t;
if(t ==begin || t==0) {
break;
}
else cout<<"<-";
t = pre[t];

}
cout<<endl<<"最短路径长度为:"<<endl;
cout<<L[end]<<endl;
return 0;

}

/*
1 6 100
1 5 30
1 3 10
2 3 5
3 4 50
4 6 10
5 4 20
5 6 60
0 0 0
*/


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  离散数学 模板