1. 程式人生 > >Hdoj 2112

Hdoj 2112

表示 inf 有時 define 算法 stl 什麽 sca jks

原題鏈接

描述

經過錦囊相助,海東集團終於度過了危機,從此,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