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

#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
*/




  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值