Hdoj 2112
原題鏈接
描述
經過錦囊相助,海東集團終於度過了危機,從此,HDU的發展就一直順風順水,到了2050年,集團已經相當規模了,據說進入了錢江肉絲經濟開發區500強。這時候,XHD夫婦也退居了二線,並在風景秀美的諸暨市浬浦鎮陶姚村買了個房子,開始安度晚年了。
這樣住了一段時間,徐總對當地的交通還是不太了解。有時很郁悶,想去一個地方又不知道應該乘什麽公交車,在什麽地方轉車,在什麽地方下車(其實徐總自己有車,卻一定要與民同樂,這就是徐總的性格)。
徐總經常會問蹩腳的英文問路:“Can you help me?”。看著他那迷茫而又無助的眼神,熱心的你能幫幫他嗎?
請幫助他用最短的時間到達目的地(假設每一路公交車都只在起點站和終點站停,而且隨時都會開)。
輸入
輸入數據有多組,每組的第一行是公交車的總數N(0<=N<=10000);
第二行有徐總的所在地start,他的目的地end;
接著有n行,每行有站名s,站名e,以及從s到e的時間整數t(0<t<100)(每個地名是一個長度不超過30的字符串)。
note:一組數據中地名數不會超過150個。
如果N==-1,表示輸入結束。
輸出
如果徐總能到達目的地,輸出最短的時間;否則,輸出“-1”。
樣例輸入
6
xiasha westlake
xiasha station 60
xiasha ShoppingCenterofHangZhou 30
station westlake 20
ShoppingCenterofHangZhou supermarket 10
xiasha supermarket 50
supermarket westlake 10
-1
樣例輸出
50
思路
dijkstra算法,需要稍微優化一下,不然會超時。
讀入的時候註意一下,我選擇用map,然後編號從1開始。
我剛開始理解錯題意,以為公交車站有N個,然後WA了好幾次。
代碼
#include <bits/stdc++.h> #define INF 99999999 #define maxn 152 using namespace std; int dist[maxn][maxn]; int length[maxn], f[maxn]; int n, sum; char s1[50], s2[50]; void init() { sum = 2; memset(f, 0, sizeof(f)); for(int i = 0; i < maxn; i++) for(int j = 0; j < maxn; j++) dist[i][j] = INF; } void dijkstra(int v) { f[v] = 1; for(int i = 1; i <= sum; i++) length[i] = dist[v][i]; while(1) { int min = INF, k = -1; for(int j = 1; j <= sum; j++) if(!f[j] && length[j] < min) {min = length[j]; k = j;} if(k == -1) break; f[k] = 1; for(int j = 1; j <= sum; j++) if(!f[j] && dist[k][j] < length[j] - min) length[j] = dist[k][j] + min; } } int main() { while(~scanf("%d", &n)) { if(n == -1) break; init(); scanf("%s %s", s1, s2); map<string, int> mp; mp[s1] = 1; mp[s2] = 2; if(strcmp(s1,s2) == 0) dist[1][2] = 0; for(int i = 0; i < n; i++) { int d; scanf("%s %s %d", s1, s2, &d); if(mp[s1] == 0) mp[s1] = ++sum; if(mp[s2] == 0) mp[s2] = ++sum; if(dist[mp[s1]][mp[s2]] > d) dist[mp[s1]][mp[s2]] = dist[mp[s2]][mp[s1]] = d; } dijkstra(1); if(length[2] < INF) printf("%d\n", length[2]); else printf("-1\n"); } return 0; }
Hdoj 2112