话不多说,直接上实现出来的代码
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
int main() {
int n,t,b,e;
cin>>n>>t>>b>>e;
int list[n+1][n+1]; //创建距离和路径矩阵
int path[n+1][n+1];
memset(list,-1, sizeof(list)); //初始化开始
memset(path,-1, sizeof(path));
for (int i = 0; i < t; ++i) {
int a,c;
cin>>a>>c;
cin>>list[a][c];
}
for (int j = 1; j <= n; ++j) {
list[j][j]=0;
} //初始化完成
for (int k = 1; k <= n; ++k) { //开始对每一对起始/结束对进行松弛操作
for (int i = 1; i <=n; ++i) {
for (int j = 1; j <=n; ++j) {
if(i==j)continue;
if(list[i][k]!=-1&&list[k][j]!=-1) //如果中转点到起点和终点都有通路
if(list[i][j]==-1||(list[i][j]>list[i][k]+list[k][j])){ //如果两点之间路径不存在或者走中转点更快
list[i][j]=list[i][k]+list[k][j]; //松弛并记录该路径上最后一个中转点
path[i][j]=k;
}
}
}
}
cout<<list[b][e]<<endl;
vector<int>ans;
ans.push_back(e);
while(1){
if(path[b][e]!=-1){
e=path[b][e];
ans.push_back(e);
}else break;
}
cout<<b<<' ';
for(vector<int>::iterator it=ans.end()-1;it!=ans.begin()-1;it--)cout<<*it<<' '; //输出路径
return 0;
}