dijkstra algorithm 模板(showpath)

来源:互联网 发布:hey软件 编辑:程序博客网 时间:2024/06/06 02:20

//未使用优先队列,时间复杂度为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;
}


原创粉丝点击