详情看注释
#include <stdio.h>
int main(){
int m,n,j,i;
int dp[100][100];//最小距离,dp[i][j],从i到j
int lj[100][100];//lj[i][j]表示从从i到j这条最短路径上面,到达j的前一个节点
int x,y,l;
for(i=0;i<100;i++){
for(j=0;j<100;j++){
dp[i][j]=99999;//开始默认为99999距离
if(i==j)dp[i][j]=0;//自己到自己要走的距离为零
if(i==j)lj[i][j]=-1;//自己到自己没有前一个点,用-1来表示
}
}
scanf("%d",&m);//输入有多少的节点 //1,2......//节点从1开始
scanf("%d",&n);//一共有多少条路径
for(i=1;i<=n;i++){
scanf("%d%d%d",&x,&y,&l);//x开始节点 y目的地节点 l两节点之间的距离
dp[x][y]=l;//用dp[x][y]来储存数据
}
for(i=1;i<=m;i++){
for(j=1;j<=m;j++){
if(dp[i][j]==99999)lj[i][j]=-1;//如果i到j没有路径
else{//这里否则就是存在两个节点可以互通,那么i到j就说明i是到达j的前一个节点
lj[i][j]=i;
}
}
}
for(i=1;i<=m;i++){//遍历经过每一个节点
for(x=1;x<=m;x++){
for(y=1;y<=m;y++){
if(x==y||x==i||y==i)continue;//这里可以自己模拟一下,i表示这里必须要经过的节点,所以如果x或者y以及等于i说明已经经过了i节点,不用再更新,直接continue跳过
if((dp[x][i]+dp[i][y])<dp[x][y]){//如果从x到i,在从i到y的距离小于原来的x到y,就更新数据
dp[x][y]=dp[x][i]+dp[i][y];
lj[x][y]=lj[i][y];//x到达y时的前一个节点就是i到达y时的前一个节点
}
}
}
}
for(i=1;i<=m;i++){
for(j=1;j<=m;j++){
if(dp[i][j]==99999)dp[i][j]=-1;//这里方便打印,就把没有互通的的节点变成-1
printf("%3d",dp[i][j]);
}
printf("\n");
}
printf("\n");
for(i=1;i<=m;i++){
for(j=1;j<=m;j++){
printf("%3d",lj[i][j]);
}
printf("\n");
}
int z,a;
scanf("%d%d",&a,&z);//输入想要查询的道路,a到z
int sum=z;//保存最后一个点
while(1){
if(lj[a][z]==-1)break;//如果检测到-1,说明完毕了
sum=sum*10+lj[a][z];//保存在sum里面
z=lj[a][z];//更新目的带z,变成到达z的上一个节点
}
int sum0=0;
while(sum){//反转一下sum
sum0=sum0*10+sum%10;
sum/=10;
}
printf("%d",sum0);//输出结果
return 0;
}