暢通工程續
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 20824 Accepted Submission(s): 7230
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 30 1 10 2 31 2 10 23 10 1 11 2
Sample Output
2-1
Code:
最簡單的Dijkstra演算法的運用, 但要考慮重邊
就是不理解為什麼邊會輸重呢,糾結啊 !!
#include<stdio.h>#include<string.h>#define M 9999999int map[205][205];int dis[205];void dijkstra(int s,int n)//起點和村莊 {int vis[205],i,j;int min = M;for(i=0;i<n;i++){//存放從起點s到i點的距離和到達i之前的一點,如果存在的話 dis[i] = map[s][i];vis[i] = 0;}dis[s] = 0;vis[s] = 1;for(i=0;i<n;i++){int loc = s;//初值為輸入的起點 min = M;for(j=0;j<n;j++){//找到沒有標記並且距離最小的點用以更新其他點 if(!vis[j] && dis[j]<min){loc = j;min = dis[j];}}vis[loc] = 1;for(j=0;j<n;j++)//計算起點到loc與loc到該點的距離和起點直接到該點的距離進行比較 {if(!vis[j] && map[loc][j]<M){int temp = dis[loc] + map[loc][j];if(dis[j] > temp){dis[j] = temp;}}}//for}}int main(){int n,m,s,e,val,i,j;while(scanf("%d%d",&n,&m)!=EOF){for(i=0;i<n;i++)for(j=0;j<n;j++)map[i][j] = M;for(i=1;i<=m;i++){scanf("%d%d%d",&s,&e,&val);if(map[s][e]>val || map[e][s]>val)map[s][e] = map[e][s] = val;//!!這裡}for(i=0;i<n;i++)dis[i] = M;scanf("%d%d",&s,&e);dijkstra(s,n);if(dis[e] == M) printf("-1\n");else printf("%d\n",dis[e]);}return 0;}