#include <iostream> #include <cstring> #define MAXI 105 #define INF 0x3f3f3f using namespace std; int a[MAXI][MAXI]; //无向图 int dist[MAXI]; //到各个点的最短路径 int n,m; //顶点数和边数 int prev[MAXI]; //路径 void Dijkstra(int v0) { bool s[MAXI]; //顶点集合 for(int i=1;i<=n;i++) //初始化 { s[i]=false; dist[i]=a[v0][i]; if(a[v0][i]<INF) prev[i]=v0; else prev[i]=-1; } dist[v0]=0; s[v0]=true; for(int i=2;i<=n;i++) { int u=v0; int maxx=INF; for(int j=1;j<=n;j++) if(!s[j]&&dist[j]<maxx) { u=j; maxx=dist[j]; } s[u]=true; for(int j=1;j<=n;j++) { if(!s[j]&&a[u][j]<INF) { if(dist[j]>dist[u]+a[u][j]) { dist[j]=dist[u]+a[u][j]; prev[j]=u; } } } } } void creat() { for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) a[i][j]=INF; for(int i=1;i<=n;i++) a[i][i]=0; } int main() { int t; int w,u,v; cin>>n>>m; creat(); for(int i=0;i<m;i++) { cin>>u>>v>>w; a[u][v]=w; a[v][u]=w; } Dijkstra(1); for(int i=1;i<=n;i++) cout<<dist[i]<<" "; t=7; while(t!=1) { cout<<prev[t]<<"->"; t=prev[t]; } return 0; } /* 7 12 1 2 7 1 3 9 1 6 14 2 3 10 2 4 15 3 4 11 3 6 2 4 5 6 5 6 9 7 4 7 7 5 5 7 6 3 */