1. 程式人生 > >最短路徑(Dijkstra)-HDU 1874-暢通工程續

最短路徑(Dijkstra)-HDU 1874-暢通工程續

  • 最短路徑(Dijkstra)-HDU 1874-暢通工程續


  • 題目連結:

暢通工程續

  • 題目基礎:

最短路徑-Dijkstra(迪傑斯特拉)演算法

  • 思路:

題目大意:

略略略

題解:

可能都有個習慣,一篇演算法兩篇水題

就說下怎樣判斷 S-T之間有無最短路:bool Vis 是用於標記加入最短路的標記陣列,如果頂點a在最短路,那麼Vis[a]=true,所以,如果Vis[T]=false ,說明最短路不存在

  • 程式碼:

#include <iostream>
#include<memory.h>
using namespace std;
#define MAX_SIZE 1024
#define INF 65535

//鄰接圖
struct MGrapth
{
    int Vexs[MAX_SIZE];  //頂點表
    int Arc[MAX_SIZE][MAX_SIZE];  //鄰接矩陣
    int Num_Vertext,Num_Edges;  //頂點數,邊數
};
MGrapth Map;

int Path[MAX_SIZE];   /*表示路徑 Path[i]->i*/
int Short_Path[MAX_SIZE]; /*Start->i 的最短路徑和*/
bool Vis[MAX_SIZE];   /*當前最短路徑結點true*/

void Init(int n,int m)
{
    memset(Vis,0,sizeof(Vis));
    memset(Path,0,sizeof(Path));
    for(int i=0;i<=n;i++)
        for(int j=0;j<=n;j++)
            Map.Arc[i][j]=INF;
    Map.Num_Vertext=n;
    Map.Num_Edges=m;
}

void Dijkstra(int Start)
{
    int v,w,k,Min;
    for(v=0;v<Map.Num_Vertext;v++)
        Short_Path[v]=Map.Arc[Start][v];  /*Start到相連結點的距離*/

    Short_Path[Start]=0;   /*Start->Start 的距離為0*/
    Vis[Start]=1;   /*Start為當前最短路徑結點*/

    for(v=1;v<Map.Num_Vertext;v++)
    {
        Min=INF;
        for(w=0;w<Map.Num_Vertext;w++)
        {
            if(!Vis[w]&&Short_Path[w]<Min)
            {
                k=w;
                Min=Short_Path[w];
            }
        }

        Vis[k]=true; /*找出最短路到散點的最小值,將該散點連入最短路*/

        for(w=0;w<Map.Num_Vertext;w++)  /*更新最短路*/
        {
            if(!Vis[w]&&Min+Map.Arc[k][w]<Short_Path[w])  /*圖中某點到v0的距離比當前路短,更新*/
            {
                Short_Path[w]=Min+Map.Arc[k][w];
                Path[w]=k;
            }
        }
    }
}


int main()
{
    int N,M;
    int A,B,X;
    int S,T;
    while(cin>>N>>M)
    {
        Init(N,M);
        for(int i=0;i<M;i++)
        {
            cin>>A>>B>>X;
            if(Map.Arc[A][B]>X)
                Map.Arc[A][B]=X;
            if(Map.Arc[B][A]>X)
                Map.Arc[B][A]=X;
        }
        cin>>S>>T;
        Dijkstra(S);
        if(!Vis[T])
            cout<<"-1"<<endl;
        else
            cout<<Short_Path[T]<<endl;
    }
    return 0;
}