2011-10-29 07:31:11Morris

a280. 小朋友上樓梯

a280. 小朋友上樓梯

內容 :

有一個小朋友,站在第 0 階樓梯上,他想要到第 n 階去。
厲害的是,這個樓梯的每一階都有自動傳送功能,
小朋友只需要選擇他想要到哪一階去,閉上眼再睜開,就到那裡去了!
例如:
第 0 階可以傳送到第 4 和第 7 階;
第 4 階會傳送到第 9 階;
第 7 階會傳送到第 3 階和第 8 階;
第 3 階會傳送到第 5 階。
那麼,小朋友如果要到第 5 階,他就可以藉由 0 -> 7 -> 3 -> 5 的傳送來到達。

現在請告訴他,是否存在那麼一種傳送法可以讓他到達目的地呢?

輸入說明 :

輸入的第一行有兩個數字 n 和 k ( 0 < n <= 100 ),其中 k ( k<=10000 ) 表示這個神奇樓梯總共有幾種傳送管道。
接下來會有 k 行,每行有兩個數字 a 和 b ( 0 <= a, b <= 100 ),表示第 a 階樓梯可以傳送到第 b 階樓梯。

輸出說明 :

如果可以,請輸出「Ok!」,否則請輸出「Impossib1e!」。

範例輸入 :

5 6
0 4
0 7
4 9
7 3
7 8
3 5

5 6
0 4
0 7
4 9
7 0
7 8
3 5

範例輸出 :

Ok!
Impossib1e!

提示 :

出處 :

(管理:VacationClub)



作法 : 路是單向的,找兩點是否連接
用單源路徑 or BFS 即可

/**********************************************************************************/
/*  Problem: a280 "小朋友上樓梯" from                                       */
/*  Language: C (1407 Bytes)                                                      */
/*  Result: AC(64ms, 616KB) judge by this@ZeroJudge                               */
/*  Author: morris1028 at 2011-10-28 20:42:36                                     */
/**********************************************************************************/


#include<stdio.h>
#include<stdlib.h>
#define oo 100000
typedef struct {
    int x, y, v;
}Pair;
Pair Path[10001];
int cmp(const void *i, const void *j) {
    Pair *x, *y;
    x = (Pair *)i, y = (Pair *)j;
    if(x->x < y->x)        return -1;
    else if(x->x == y->x)
            return x->v - y->v;
    else    return 1;
}
int Min(int x, int y) {
    return x < y ? x : y;
}
int NodeT[101], NodeL[101], Q[10001];
int SPFA(int st, int ed, int N) {
    int i, j, k;
    static int Used[101], V[101], QIdx;
    static int DP[101], tNode;
    for(i = 0; i <= N; i++)
        Used[i] = 0, V[i] = oo, DP[i] = 0;
    Used[st] = 1, V[st] = 0, QIdx = 0, Q[QIdx] = st;
    for(i = 0; i <= QIdx; i++) {
        tNode = Q[i], Used[tNode] = 0;
        for(j = 0, k = NodeL[tNode]; j < NodeT[tNode]; j++, k++) {
            if(V[tNode] + Path[k].v < V[Path[k].y]) {
                V[Path[k].y] = V[tNode] + Path[k].v;
                if(!Used[Path[k].y]) {
                    Used[Path[k].y] = 1, Q[++QIdx] = Path[k].y;
                }
            }
        }
    }
    return V[ed];
}
int main() {
    int N, M, i;
    while(scanf("%d %d", &N, &M) == 2) {
        for(i = 0; i <= 100; i++)
            NodeL[i] = oo, NodeT[i] = 0;
        for(i = 0; i < M; i++) {
            scanf("%d %d", &Path[i].x, &Path[i].y);
            Path[i].v = 1;
        }
        qsort(Path, M, sizeof(Pair), cmp);
        for(i = 0; i < M; i++) {
            NodeL[Path[i].x] = Min(i, NodeL[Path[i].x]);
            NodeT[Path[i].x] ++;
        }
        puts(SPFA(0, N, 100) != oo ? "Ok!" : "Impossib1e!");
    }
    return 0;
}

上一篇:a279. 分糖果囉

下一篇:a282. 認真念書