您的位置:首页 > 编程语言 > Go语言

dijkstra algorithm 模板(showpath)

2017-11-09 11:37 288 查看
//未使用优先队列,时间复杂度为O(v*v)

//dijkstra algorithm

#include<iostream>

#include<cstdio>

#include<algorithm>

#include<cstring>

#include<stack>

using namespace std;

const int INF=100000;

const int maxn=200+5;

int G[maxn][maxn];

bool done[maxn];

int d[maxn];

int parent[maxn]; //路径

int v,e;

void dijkstra()

{

    memset(done,false,sizeof(done));

    for(int i=1;i<=v;i++)

    d[i]=(i==1?0:INF);

    for(int i=1;i<=v;i++)

       {

        int x,m=INF;

        for(int y=1;y<=v;y++)

            if(!done[y]&&d[y]<=m) m=d[x=y];

        done[x]=true;

        for(int y=1;y<=v;y++)

        if(d[y]>d[x]+G[x][y])

          {

           d[y]=d[x]+G[x][y];

           parent[y]=x;

          }

       }

}

int main()

{

while(scanf("%d%d",&v,&e)==2&&v)

{

    for(int i=1;i<=v;i++)

        for(int j=1;j<=v;j++)

             if(i==j) G[i][j]=0;

             else G[i][j]=INF;

    for(int i=0;i<e;i++)

       {

         int v1,v2,dist;

         scanf("%d%d%d",&v1,&v2,&dist);

         if(G[v1][v2]>dist) G[v1][v2]=dist;

                            //避免重边的情况

       }

    dijkstra();

    int end;

    while(scanf("%d",&end)==1&&end>=1&&end<=v)

     {

           if(d[end]>=INF) printf("No path.\n");

           else {

                   printf("%d\n",d[end]);

                   stack<int>path;

                   int x=end;

                   while(x!=1)

                      {

                        path.push(x);

                        x=parent[x];

                      }

           path.push(1);

           while(!path.empty())

              {

                 printf("%d ",path.top());

                 path.pop();

              }

            printf("\n");

               }

      }

 }

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  图论 dijkstra 算法