这道题目检查对于dijkstra算法的掌握,如果对于这个算法有疑问的,可以看看这个博客点击打开链接,基本上已经讲得很清楚了。
其实这种题目最难的不是这个算法,而是一些小细节。他的提示里有说:火车能从城市x到城市y,就能从城市y到城市x,并且同一列火车来回所花费的时间是一样的。如果在x和y之间有不止一辆火车通行,则不同火车从x到y或者从y到x所花费的时间可能不相同。 说明一个路线可能会出现两次,我们要选择最小的那一次。不仅这道题,最短路径的题目很多都有这个隐含的小细节,坑了我多少次。。
dijkstra算法代码整体模板就是这个博客点击打开链接的。
#include<iostream>
#include<string.h>
#define MAX 1000000
using namespace std;
int map[200][200];
int sp[200];
int s[200];
int n,x,y;
void djs(){
for(int i=1;i<=n;i++){
sp[i]=MAX;s[i]=0;
}
int init=x;int count=1;
int mv,mi;
while(count++<=n){
mv=MAX+1, mi=-1;
for(int i=1;i<=n;i++){
if(!s[i]){
if(map[x][i]<sp[i])
sp[i]=map[init][i];
if(map[init][i]+sp[init]<sp[i])
sp[i]=map[init][i]+sp[init];
if(sp[i]<mv){
mv=sp[i];mi=i;
}
}
}
s[mi]=1;init=mi;
}
cout<<sp[y]<<endl;
}
int main(){
int m;
while(cin>>n>>m>>x>>y){
memset(map,1,sizeof(map));
for(int i=0;i<m;i++){
int a,b,t;
cin>>a>>b>>t;
map[a][b]=map[b][a]=min(t,map[a][b]);
}
djs();
}
}