2
题解:1—n的最短路(双向)(普通最短路)
///最短路2,Dijkstra(单源最短路)(不可有负权值,也不可有回路) #include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <string> using namespace std; const int maxx=10005; const int inf=99999999; int book[maxx]; int dis[maxx]; int e[maxx][maxx]; int n,m; int main() { while(scanf("%d %d",&n,&m)&&(n+m)) { for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { if(i==j) e[i][j]=0; else e[i][j]=inf; } for(int i=1;i<=n;i++) book[i]=0; for(int i=1;i<=m;i++) { int t1,t2,t3; scanf("%d %d %d",&t1,&t2,&t3); e[t1][t2]=t3;///单向 e[t2][t1]=t3;///如果是双向的话 } for(int i=1;i<=n;i++) { dis[i]=e[1][i]; } book[1]=1; int u; ///Dijkstra核心代码: for(int i=1;i<=n-1;i++) { int minn=inf; for(int j=1;j<=n;j++) { if(book[j]==0&&dis[j]<minn) { minn=dis[j]; u=j; } } book[u]=1; for(int v=1;v<=n;v++) { if(e[u][v]<inf) { if(dis[v]>dis[u]+e[u][v]) dis[v]=dis[u]+e[u][v]; } } } // for(int i=1;i<=n;i++)///1-其他各点的最短路 printf("%d\n",dis[n]);///1-n的最短路 } return 0; }