dijkstra求最短路径(水题)

0007:dijkstra求最短路径

总时间限制: 
10000ms 
内存限制: 
1000kB
描述

给出一个有向图的结构,求某个顶点到另一点的最短路径

输入
若干行整数,第一行有2个数,分别为顶点数v和弧数a,第二行为起点编号s和终点编号e,接下来有a行,每一行有3个数,分别是该条弧所关联的两个顶点编号和弧的权值
输出
第一行为一个整数,为最短路径值

第二行为若干个空格隔开的顶点构成的最短路径序列(用小写字母)

若无最短路径,直接输出no answer

样例输入
6 8
0 3
0 2 10
0 4 30
0 5 100
1 2 5
2 3 50
3 5 10
4 3 20
4 5 60
样例输出
50

v0 v4 v3

 
#include "iostream"
#include "stack"
using namespace std;
#define Sky 9999
#define Max 105
int Top,Edge,Pre[Max],Start,End,Map[Max][Max],Dist[Max];
bool Move[Max];

bool Dij()
{ 
    int i,j;
    bool Flag;
    for(i=0;i<Top;i++)
    {
     Dist[i]=Map[Start][i];
     Move[i]=false;
     if(Dist[i]!=Sky)
     Pre[i]=Start;
     else
     Pre[i]=-1;
    }
    Dist[Start]=0;
    Move[Start]=true;
    for(i=0;i<Top;i++)
    {
     int min=Sky,k=-1;
     
     for(j=0;j<Top;j++)
     {
         if(min>Dist[j] && !Move[j])
         {
            k=j;
            min=Dist[j];
         }
     }
    
     if(k==-1  || k==End) 
     {
        if(k==-1) 
        Flag=false;
        else
        Flag=true;

        break;
     }
     Move[k]=true;
     for(j=0;j<Top;j++)
     {
         if(!Move[j] && Dist[j]>Dist[k]+Map[k][j])
         {
             Dist[j]=Dist[k]+Map[k][j];
             Pre[j]=k;
         }
     }
    }  
    return Flag;
}

void Output()
{ 

     stack<int> Way;
      
     int item;
     item=Pre[End];
     Way.push(item);
     while(Start!=item)
     {   
         item=Pre[item];
         Way.push(item);
     }
     
     cout<<Dist[End]<<endl;
     
     while(!Way.empty())
     { 
         cout<<"v"<<Way.top()<<" ";
         Way.pop();
     }
     cout<<"v"<<End;
}

int main()
{    
    
    // freopen("1.txt","r",stdin);
     while(cin>>Top>>Edge  && Top!=0)
     { 
     cin>>Start>>End;
     int i,j;
     for(i=0;i<Top;i++)
     for(j=0;j<Top;j++)
     Map[i][j]=Sky;

     for(i=0;i<Edge;i++)
     {
         int x,y,z;
         cin>>x>>y>>z;
         Map[x][y]=z;
     }

     if(!Dij())
     cout<<"no answer"<<endl;
     else
     Output();

     cout<<endl;

     }




    return 0;
}
    原文作者:Dijkstra算法
    原文地址: https://blog.csdn.net/qq_34125999/article/details/51404622
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞