九度 1341 -图最短路径 - 艾薇儿的演唱会

这道题目检查对于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();
    }
}



你可能感兴趣的:(九度 1341 -图最短路径 - 艾薇儿的演唱会)