HDOJ 1874 最短路问题

题目大意:输入N,M,分别表示有编号(0~N-1)N个城镇和M调街道,接下来输入M条道路及其所花费的时间,之后输入起点和终点,最后求出从起点到终点所花费的最短时间。

算法思想:

               迪杰斯特拉算法

              1.根据输入信息建立邻接矩阵,为无向图。此处需要注意会有道路覆盖的问题,此时应用花费时间最小的道路。

               2.用dis[]数组存储从原点到其它节点的最短距离,进行初始化。

               3.使用优先队列找出最小的权值去d[u],然后对所有与u邻接的顶点进行更新,直至队列为空时结束。

               4.判断到路是否存在若存在输出最小花费时间。

代码如下:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int INFINMAX=0xfffffff;
int C[205][205];//邻接矩阵,存储无向图
int d[205];//记录源节点距离其他节点的最小距离
int vis[205];//源点集合

void DIJSTRA(int N,int S,int T){
    for(int i=0;i<N;i++){
       d[i]=C[S][i];
       vis[i]=0;
    } 
    d[S]=0;
    for(int i=0;i<N;i++){
        int min=INFINMAX,u;
        for(int j=0;j<N;j++){//寻找距离源点最近的节点
            if(d[j]<min&&!vis[j]){//***注意要保证是队列中的点***
                   min=d[j];
                   u=j;
             }     
        }
        vis[u]=1;
        for(int j=0;j<N;j++){//遍历U的所有邻接边
            if(!vis[j]&&d[j]>d[u]+C[u][j]){
                    d[j]=d[u]+C[u][j];
            }        
        }
    } 
     if(d[T]!=INFINMAX) cout<<d[T]<<endl;
     else cout<<-1<<endl;
}
int main(){
int N,M,A,B,X,S,T;
    while(cin>>N>>M){
        for(int i=0;i<N;i++){
            for(int j=0;j<N;j++){
                if(i!=j) 
                  C[i][j]=INFINMAX;
                else 
                  C[i][j]=0;   
            }
        }
        for(int i=0;i<M;i++){
             cin>>A>>B>>X;
             C[A][B]=min(C[A][B],X);
             C[B][A]=min(C[B][A],X);
        }
        cin>>S>>T;  
        DIJSTRA(N,S,T);
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值