HDU 2544 最短路
阿新 • • 發佈:2018-12-09
最短路
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; }