题目大意:输入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;
}