1. 程式人生 > >HDU 2544 最短路

HDU 2544 最短路

最短路

Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 90382    Accepted Submission(s): 39182  

Problem Description

在每年的校賽裡,所有進入決賽的同學都會獲得一件很漂亮的t-shirt。但是每當我們的工作人員把上百件的衣服從商店運回到賽場的時候,卻是非常累的!所以現在他們想要尋找最短的從商店到賽場的路線,你可以幫助他們嗎?  

Input

輸入包括多組資料。每組資料第一行是兩個整數N、M(N<=100,M<=10000),N表示成都的大街上有幾個路口,標號為1的路口是商店所在地,標號為N的路口是賽場所在地,M則表示在成都有幾條路。N=M=0表示輸入結束。接下來M行,每行包括3個整數A,B,C(1<=A,B<=N,1<=C<=1000),表示在路口A與路口B之間有一條路,我們的工作人員需要C分鐘的時間走過這條路。 輸入保證至少存在1條商店到賽場的路線。

Output

對於每組輸入,輸出一行,表示工作人員從商店走到賽場的最短時間

Sample Input

2 1

1 2 3

3 3

1 2 5

2 3 5

3 1 2

0 0

Sample Output

3 2

/* 
dij
     步驟:
	      1. 初始化 邊(INF) 標記(0)
          2. 確定 源點
          3. 找到與源點距離最近的點,記為 v
          4. 用v 去優化 從 源點 ?經過 點v 到 點K 的路 的距離(這一步也叫鬆弛) 
*/
#include<iostream>
#include<cstring>
using namespace std;
const int maxn = 10001;
const int inf = 0x3f3f3f3f;
int dis[maxn],vis[maxn];
int eg[111][111];
int main(void){
    int N,M,A,B,C;
    while(scanf("%d%d",&N,&M)!=EOF&&(N||M)){

      for(int i =1;i<=N;i++)
         for(int j=1; j<=N;j++) 
            eg[i][j]= inf;

      for(int i = 1;i<=M;i++){
           scanf("%d%d%d",&A,&B,&C);
           eg[A][B] = C;
         eg[B][A] = C;//這一步看題意
}

     for(int i =1;i<=N;i++){

     dis[i] = eg[1][i];
     vis[i] = 0;
 }

     vis[1] = 1;  //源點 預設為 已經是最優
     int min = inf;
     int v=0; 

     for(int i=1;i<=N-1;i++){//表示 進行 N-1 次查詢

          min = inf; //初始化 最小值?
          for(int j = 1;j<=N;j++){//找到離源點最近的點
           if(vis[j] == 0 && dis[j] < min){
            min = dis[j];
            v = j;
         }
    }

         vis[v] = 1; //標記為最優點 好好想想 因為這是我們找到的最近的點

         for(int k =1;k<=N;k++){ //進行鬆弛
         if( vis[k] == 0){
         if( dis[v] + eg[v][k] < dis[k]){
         dis[k]  = dis[v] + eg[v][k];
         }

      }
    }
 }

          printf("%d\n",dis[N]);
  }

     return 0;
}