最短路徑問題(Dijkstar算法 HDU 1874 暢通工程續  )詳解

HDU 1874 暢通工程續  

 

暢通工程續

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 10327    Accepted Submission(s): 3451

 

Problem Description

某省自從實行了很多年的暢通工程計劃後,終於修建了很多路。不過路多了也不好,每次要從一個城鎮到另一個城鎮時,都有許多種道路方案可以選擇,而某些方案要比另一些方案行走的距離要短很多。這讓行人很困擾。

現在,已知起點和終點,請你計算出要從起點到終點,最短需要行走多少距離。

 

 

Input

本題目包含多組數據,請處理到文件結束。
每組數據第一行包含兩個正整數N和M(0<N<200,0<M<1000),分別代表現有城鎮的數目和已修建的道路的數目。城鎮分別以0~N-1編號。
接下來是M行道路信息。每一行有三個整數A,B,X(0<=A,B<N,A!=B,0<X<10000),表示城鎮A和城鎮B之間有一條長度爲X的雙向道路。
再接下一行有兩個整數S,T(0<=S,T<N),分別代表起點和終點。

 

 

Output

對於每組數據,請在一行裏輸出最短需要行走的距離。如果不存在從S到T的路線,就輸出-1.

 

 

Sample Input

3 3

0 1 1

0 2 3

1 2 1

0 2

3 1

0 1 1

1 2

 

 

Sample Output

2

-1

2012-04-07 09:31:33|  分類: 最短路問題|舉報|字號 訂閱

最短路徑問題(Dijkstar算法)

算法分析

"HDU 2544 最短路"(http://qianmacao.blog.163.com/blog/static/203397180201236114656481/)完全一樣,不再贅述。

詳情見文章“最短路徑算法—Dijkstra(迪傑斯特拉)算法分析與實現”。

代碼如下:

 

 

#include<iostream>
using namespace std;
const int mmax=2000000;
int dist[200]/*表示當前點到源點的最短路徑長度*/,c[200][200];// 記錄圖的兩點間路徑長度
void Dijkstar(int n,int v)
{
    bool s[200];//判斷是否已存入該點到S集合中 
    int i,j;
    for(i=0;i<n;i++)
    {
        s[i]=0;  // 初始都未用過該點 
        dist[i]=c[v][i];//存入當前點 到源點的路徑長 
    }
    s[v]=1;//源點存入到s集合中 
    dist[v]=0;//源點到源點的路徑長爲0 
    for(i=1;i<n;i++)
    {
        int temp=mmax;    //轉換賦值,防止混亂 
        int u=v;
        for(j=0;j<n;j++)//遍歷所有的點,找到和起點相連的點 
        {
            if(!s[j]&&dist[j]<temp)//如果j沒有存在,並且j 到源點的值小於已經存在的值 
            {
                temp=dist[j];//取小的路徑長 
                u=j;//起點轉換 
            }
        } 
         s[u]=1;//起點存入到s集合中 
         for(j=0;j<n;j++)//遍歷所有的點 ,尋找和新起點相連而且不是在已經在s集合中的點, 
         {
             if(!s[j]&&c[u][j]+dist[u]<dist[j])//如果j沒有存入到s的集合中,並且查找當前點到起始點的最小路徑 
             {
                 dist[j]=dist[u]+c[u][j];//取更小的路徑長 
             }
         }
    }
}
int main()
{
    int n,m,s,t;
    int a,b,x,i,j;
    while(cin>>n>>m)
    {
        for(i=0;i<n;i++)//初始賦值,把所有的端點都賦值 
        {
            for(j=0;j<n;j++)
               if(i==j)
                  c[i][j]=0;//本身到本身距離爲零 
                else
                  c[i][j]=mmax;//其餘的全部設置爲最大值,方便後面判斷,更改 
        }
        for(i=0;i<m;i++)//讀入已經有路的信息,權值、端點 
        {
            cin>>a>>b>>x;//讀入兩個端點,以及兩個端點的距離 
            if(x<c[a][b])//有重邊,也就是判斷是否有相同的路徑,如果有相同的,取最小的路徑替換已有的路徑長 
            {
                c[a][b]=c[b][a]=x;
            }
        }
            for(i=0;i<n;i++)//初始當前點到源點的最短路徑長度 
            {
                dist[i]=mmax;//全部設置爲最大值 
             } 
            cin>>s>>t;//讀入源點和終結點 
            Dijkstar(n,s);//調用算法 ,將端點個數和源點輸入到所調用的函數中 
            if(dist[t]==mmax)//如果還是沒有路徑的話, 
               cout<<"-1"<<endl;//輸出1 
            else 
               cout<<dist[t]<<endl;//如果有的話,輸出最短路徑長度 
        }
        return 0;
}


 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章