2011-06-15 07:39:05Morris

c125. Frogger

http://zerojudge.tw/ShowProblem?problemid=c125

內容 :

有一隻叫做Freddy的青蛙坐在湖中央的一塊石頭上,突然間他發現另一隻青蛙(她的名字是Fiona)坐在另一顆石頭上。他想要過去找她,但是因為湖水很髒,到處充滿著遊客的防曬油,所以他決定用跳的,而不要用游的。

不妙的是Fiona的石頭離他的距離超出他所能跳的範圍。因此Freddy考慮利用其他的一些石頭當作中繼站,因此他就可以跳比較小的距離(或許要跳許多次)去找Fiona。

要 這樣子連續的跳,很明顯的Freddy一次能跳的距離必須至少和這一串石頭間的距離最大的距離一樣。因此,介於石頭間的蛙跳距離(frog distance,人類也稱之為minmax distance)定義為要從Freddy所在的石頭要跳到Fiona所在的石頭的路徑中,最小必須要跳的距離。

給你Freddy所在的石頭、Fiona所在的石頭,以及湖中所有其他石頭的座標,你的任務是算出介於Freddy和Fiona所在石頭間的蛙跳距離。

輸入說明 :

輸入含有多組測試資料。每組測試資料的第一列有1個整數n,代表石頭的數目(2 <= n <= 200)。接下來的n列每列有2個整數xi,yi(0 <= xi,yi <= 1000)代表第i顆石頭的座標。其中第一顆為Freddy所在的石頭,第二顆為Fiona所在的石頭,其他的n-2顆石頭上則是空的。

每組測試資料後有一空白列,當n=0時代表輸入結束。請參考Sample Input。

輸出說明 :

對每一組測試資料,輸出一列這是第幾組測試資料,以及一列蛙跳距離。

每組測試資料後亦輸出一空白列。請參考Sample Output。

範例輸入 :

2
0 0
3 4

3
17 4
19 4
18 5

0

範例輸出 :

Scenario #1
Frog Distance = 5.000

Scenario #2
Frog Distance = 1.414

提示 :

背景知識: Shortest Path


* Luck 貓翻譯

出處 :

ACM 534




作法 : SPFA

從起點走到終點,找出路徑上權值最大者

每條路都有一個權值最大的值,在每條路的最大值中,找最小值

/**********************************************************************************/
/*  Problem: c125 "Frogger" from ACM 534                                          */
/*  Language: C                                                                   */
/*  Result: AC (6ms, 774KB) on ZeroJudge                                          */
/*  Author: morris1028 at 2011-06-14 18:58:06                                     */
/**********************************************************************************/


#include<stdio.h>
#include<math.h>
struct coordinate {
    int x, y;
}D[200];
struct link {
    double t;
    int index;
}Map[200][200];
double SPFA(int n) {
    double V[200], t;
    int a, b, Queue[40000], Qt = 0, Used[200] = {}, tn;
    for(a = 0; a < n; a++)    V[a] = 2000;
    Queue[0] = 0, V[0] = 0;
    for(a = 0; a <= Qt; a++) {
        tn = Queue[a], Used[tn] = 0;
        for(b = 0; b < n; b++) {
            t = V[tn] > Map[tn][b].t ? V[tn] : Map[tn][b].t;
            if(V[Map[tn][b].index] > t) {
                V[Map[tn][b].index] = t;
                if(Used[Map[tn][b].index] == 0) {
                    Used[Map[tn][b].index] = 1, Queue[++Qt] = Map[tn][b].index;
                }
            }
        }
    }
    return V[1];
}
main() {
    int n, a, b, c, C = 0;
    while(scanf("%d", &n) == 1 && n) {
        for(a = 0; a < n; a++)
            scanf("%d %d", &D[a].x, &D[a].y);
        for(a = 0; a < n; a++) {
            for(b = 0; b < n; b++) {
                Map[a][b].t = sqrt((D[a].x-D[b].x)*(D[a].x-D[b].x) + (D[a].y-D[b].y)*(D[a].y-D[b].y));
                Map[a][b].index = b;
            }
        }
        printf("Scenario #%d\n", ++C);
        printf("Frog Distance = %.3lf\n\n", SPFA(n));
    }
    return 0;
}