代码如下:
#include<iostream>
#include<stack>
#define MAX 10000
#define INF 0x3f3f3f3f
using namespace std;
int visit[MAX];//访问数组
int dis[MAX];//记录最短距离
int path[MAX];//记录路径
int mp[MAX][MAX];
int n,m;//结点数和边数
stack<int> q;//用于路径的顺序输出
void dijkstra(int s){//dijkstra
dis[s]=0;
for(int i=1;i<=n;i++){
int minv=INF;
int u=-1;
for(int j=1;j<=n;j++){
if(dis[j]<minv&&visit[j]==0){
minv=dis[j];
u=j;
}
}
if(u==-1){
return;
}
visit[u]=1;
for(int v=1;v<=n;v++){
if(visit[v]==0&&mp[u][v]!=INF){
if(dis[v]>dis[u]+mp[u][v]){
dis[v]=dis[u]+mp[u][v];
path[v]=u;//path[v]的值等于它的前一个结点的编号
}
}
}
}
}
int main(){
while(cin>>n>>m){
for(int i=0;i<MAX;i++){//初始化图
for(int j=0;j<MAX;j++){
mp[i][j]=INF;
}
}
for(int i=0;i<MAX;i++){//初始化path数组
path[i]=-1;
visit[i]=0;
dis[i]=INF;
}
int start=1;//起始点为1
int a,b,len;
for(int i=0;i<m;i++){
cin>>a>>b>>len;
mp[a][b]=len;
}
dijkstra(start);
for(int i=1;i<=n;i++){//输出最短距离
cout<<dis[i]<<" ";
}
cout<<endl;
for(int i=1;i<=n;i++){//输出路径
int p=i;
while(path[p]!=-1){//将最短路径上的结点入栈
q.push(p);
p=path[p];
}
cout<<start<<"-->"<<i<<" ";
cout<<"dis: "<<dis[i]<<" ";
cout<<start;
while(!q.empty()){//结点依次出栈
cout<<"-->"<<q.top();
q.pop();
}
cout<<endl;
}
}
return 0;
}