Dijkstra算法的模板题,嘻嘻,第一道最短路,模板题呀,本来幻想着1A 的,可惜呀,少了一个条件,一个很重要的条件,既然是最短路,有重边的话,当然是保存较短的一条边,结果我根本没注意到,直接覆盖了
悲剧,……………………
最短路径的四个算法,看了快一天了,终于有一点点的收获,多亏了大牛博客上的详解呀
http://www.wutianqi.com/?p=1890 Dijkstra算法实现
http://www.wutianqi.com/?p=1912 Bellman-Ford算法
http://www.wutianqi.com/?p=2285 SPFA(Shortest Path Faster
Algorithm) 上一个算法的优化
//以上三个是层层深入的,单源最短路
http://www.wutianqi.com/?p=1903
//这个是求解任意两点间的最短距离
#include<iostream> #include<string> using namespace std; bool s[200]; int c[200][200],dis[200],n,m,S,T; void dijkstra() { for(int i=0;i<n;i++) { dis[i]=c[S][i]; } dis[S]=0; for(int i=1;i<n;i++) { int tmp=INT_MAX,v=S; for(int j=0;j<n;j++) if(!s[j]&&dis[j]<tmp) { tmp=dis[j]; v=j; } s[v]=1; for(int j=0;j<n;j++) if(!s[j]&&c[v][j]<INT_MAX) { int newdis=dis[v]+c[v][j]; if(newdis<dis[j]) dis[j]=newdis; } } } int main() { int len; while(cin>>n>>m) { for(int i=0;i<n;i++) for(int j=0;j<n;j++) c[i][j]=INT_MAX; int a,b; for(int k=0;k<m;k++) { cin>>a>>b>>len; if(len<c[a][b]) { c[a][b]=len; c[b][a]=len; } } cin>>S>>T; memset(s,0,sizeof(s)); s[S]=1; dijkstra(); if(dis[T]<INT_MAX) cout<<dis[T]<<endl; else cout<<-1<<endl; } return 0; }