#include<bits/stdc++.h>
using namespace std;
int dis[59],w[59][59];
//dis[u]代表从节点0(即起点)到u最短路径长度
//w[u][v]表示连接u,v边的长度 不相连即为0
bool isyou[59];
//isyou[i]表示是否为最优路径中的节点
int main(){
int m;cin>>m;//m表示有多少个点
int n;cin>>n;//n表示有多少条边
//int ed;cin>>ed;//ed为终点
for(int i=1;i<=n;i++){
int a,b,c;
cin>>a>>b>>c;
w[a][b]=c;
w[b][a]=c;
}
dis[1]=0;
isyou[1]=1;
for(int i=2;i<=m;i++)dis[i]=10000;
for(int i=1;i<=m;i++){
int k=0;
for(int j=1;j<=m;j++)
if(isyou[j]==0&&(k==0||dis[j]<dis[k]))
k=j;
isyou[k]=1;
for(int j=1;j<=m;j++)
if(isyou[j]==0&&(dis[k]+w[k][j]<dis[j]))
dis[j]=dis[k]+w[k][j];
}
for(int i=2;i<=m;i++)
cout<<i<<" "<<dis[i]<<endl;
return 0;
}
测试样例:
5 7
1 2 2
1 3 4
2 3 1
2 5 2
3 5 6
1 4 7
3 4 1