usaco 2000 contest 滑雪

2013-09-11 10:22

【题目大意】给定N个点的高度和M条相连的路线(单向),从最高点向下走,

到无法走时为一条路径,求不同的路径数,(一节点不同就叫不同)

【输入样例】

4 5   (N,M)

500 400 300 200  (高度)

1 2                (边)

2 3

3 4

1 4

2 4

【输出样例】

3

//By BLADEVIL
var
    n, m                    :longint;
    pre, other              :array[0..5100] of longint;
    last                    :array[0..300] of longint;
    h                       :array[0..300] of longint;
    max                     :longint;
    vis                     :array[0..300] of boolean;
    l                       :longint;
    ans                     :longint;

procedure connect(x,y:longint);
begin
    inc(l);
    pre[l]:=last[x];
    last[x]:=l;
    other[l]:=y;
end;

procedure init;
var
    i, x, y, z              :longint;
begin
assign(input,'ski.in'); reset(input);
assign(output,'ski.out'); rewrite(output);
    read(n,m);
    max:=0; l:=1;
    for i:=1 to n do
    begin
        read(h[i]);
        if h[i]>h[max] then max:=i;
    end;
    for i:=1 to m do
    begin
        read(x,y);
        connect(x,y);
    end;
end;

procedure dfs(x:longint);
var
    p, q                    :longint;
begin
    q:=last[x];
    if q=0 then
    begin
        inc(ans);
        exit;
    end;
    while q<>0 do
    begin
        p:=other[q];
        if not vis[p] then
        begin
            vis[p]:=true;
            dfs(p);
            vis[p]:=false;
        end;
        q:=pre[q];
    end;

end;


begin
    init;
    dfs(max);
    writeln(ans);
close(input); close(output);
end.

 

转载于:https://www.cnblogs.com/BLADEVIL/p/3433493.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值