Dijkstra 求单源最短路径模板

代码如下:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <stack>
using namespace std;
const int maxn=1005;
const int INF=0x3f3f3f3f;
int edge[maxn][maxn];
int d[maxn];  //表示从1到n的最短路径长度
int vis[maxn]; //表示是否被压入集合
int path[maxn]; //表示此点的上一个节点
int n,m;
void init ()
{
    memset (vis,0,sizeof(vis));
    for (int i=1;i<=n;i++)
        for (int j=1;j<=n;j++)
            if(i==j)
              edge[i][j]=0;
            else
              edge[i][j]=INF;
    memset (path,-1,sizeof(path));
}
void Dijkstra (int x) //从x到别的点的最短距离
{
    for (int i=1;i<=n;i++)
        d[i]=edge[x][i];
    while (1)
    {
        int u=-1;
        int maxx=INF;
        for (int i=1;i<=n;i++)
            if(!vis[i]&&d[i]<maxx)
           {
                 maxx=d[i];
                 u=i;
           }
        if(u==-1)
            break;
        vis[u]=1;
        for (int i=1;i<=n;i++)
            if(!vis[i]&&d[i]>d[u]+edge[u][i])
                  {
                      d[i]=d[u]+edge[u][i];
                      path[i]=u;
                  }
    }
}
void findpath(int start,int endd) //打印出最短路
{
    if(start==endd)
        return;
    stack<int>s;
    int fin=endd;
    printf("%d->",start);
    while (path[endd]!=-1)
    {
        s.push(path[endd]);
        endd=path[endd];
    }
    while (!s.empty())
    {
        printf("%d->",s.top());
        s.pop();
    }
    printf("%d\n",fin);
}
int main()
{
    int x;
    scanf("%d%d%d",&n,&m,&x);
    init();
    for (int i=0;i<m;i++)
    {
        int x,y,len;
        scanf("%d%d%d",&x,&y,&len);
        edge[x][y]=edge[y][x]=len;
    }
    Dijkstra(x);
    for (int i=1;i<=n;i++)
    {
      if(i!=x)
      {
          printf("从%d到%d最短路径为\n",x,i);
          findpath(x,i);
          printf("从%d到%d的最短路径长度为:\n",x,i);
          printf("%d\n",d[i]);
      }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41410799/article/details/81429877