单源最短路径 Dijkstra path记录路径

在这里插入图片描述
在这里插入图片描述

代码如下:

#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;
}

猜你喜欢

转载自blog.csdn.net/weixin_44123362/article/details/89635978
今日推荐