• COGS 244. [POI2000] 滑雪队


                                                244. [POI2000] 滑雪队

    一个滑雪队在Byte山上组织了一次训练。山的北坡有一个滑雪场,所有的滑雪者都要从山上的起点站滑到山下的终点站。此次训练中各队员同时出发到终点站会合,除了始末两处外,队员们的滑雪路径不能相交,且山上的滑雪道只能从上往下滑。

    滑雪道的分布地图由多块被林地连接的空地组成,每块空地都处于不同的高度。两块空地间至多由一块林地连接。滑雪过程中,滑雪者可以选择路径访问任一空地(但不必全部经过)。各滑雪道只在空地相会,既不穿隧道,也不临空飞越。

    任务:

    编写一个程序完成下列工作:

    • 读入滑雪场的地图;
    • 算出能参加训练的最大队员数;
    • 把结果写入文件。

    输入:

    文件的第一行是空地的数目n,2≤n≤5000。以下n-1行,每行都有一些用空格分开的整数,第(i+1)行的数字描述的是从空地i沿林 地往下可到达的其它空地。该行第一个整数k表示这些空地的个数,以下k个整数即它们的编号,按从东到西的顺序排列(即通向各空地的林地的位置)。空地从1 到n编号。起点站建于空地1,终点站建于空地n。

    输出:

    仅一行,包括一个整数,即能参加训练的最大人数。

    输入样例:

    15
    5 3 5 9 2 4
    1 9
    2 7 5 
    2 6 8
    1 7
    1 10
    2 14 11
    2 10 12
    2 13 10
    3 13 15 12
    2 14 15
    1 15
    1 15
    1 15
    

    输出样例:

    3
    

    如下图

    Image:Nar.png

    我看一眼,以为是网络流。。

    结果发现 dfs就可以搞定 不需要那么麻烦 (实际上我并不知道网络流能不能做。。)

    小小的贪心 每次我们都从东边开始走 标记为已走过

    走不动再换路 记录走过的路径数 输出

     1 #include <vector>
     2 #include <cctype>
     3 #include <cstdio>
     4 
     5 const int MAXN=5010;
     6 
     7 int n,ans;
     8 
     9 bool vis[MAXN];
    10 
    11 std::vector<int> v[MAXN];
    12 
    13 inline void read(int&x) {
    14     int f=1;register char c=getchar();
    15     for(x=0;!isdigit(c);c=='-'&&(f=-1),c=getchar());
    16     for(;isdigit(c);x=x*10+c-48,c=getchar());
    17     x=x*f;
    18 }
    19 
    20 inline bool pd() {
    21     for(int i=0;i<v[1].size();++i) 
    22       if(!vis[v[1][i]]) return true;
    23     return false;
    24 }
    25 
    26 void DFS(int u,bool&flag) {
    27     if(u==n) {vis[u]=true;++ans;flag=true;return ;}
    28     if(vis[u]&&u!=1) return;
    29     vis[u]=true;
    30     for(int i=0;i<v[u].size();++i) {
    31         int to=v[u][i];
    32         DFS(to,flag);
    33         if(flag) return;
    34     }
    35     return;
    36 }
    37 
    38 int hh() {
    39     freopen("nar.in","r",stdin);
    40     freopen("nar.out","w",stdout);
    41     int len;
    42     read(n);
    43     for(int i=1;i<n;++i) {
    44         read(len);
    45         for(int x;len--;) {
    46             read(x);
    47             v[i].push_back(x);
    48         }
    49     }
    50     bool flag;
    51     while(pd()) flag=false,DFS(1,flag);
    52     printf("%d
    ",ans);
    53     return 0;
    54 }
    55 
    56 int sb=hh();
    57 int main(int argc,char**argv) {;}
    代码


    作者:乌鸦坐飞机
    出处:http://www.cnblogs.com/whistle13326/
    新的风暴已经出现 怎么能够停止不前 穿越时空 竭尽全力 我会来到你身边 微笑面对危险 梦想成真不会遥远 鼓起勇气 坚定向前 奇迹一定会出现

     
  • 相关阅读:
    解决android.os.NetworkOnMainThreadException
    android 模拟器对应键盘快捷键
    Android上解析Json格式数据
    命令行的由来
    Linux测网速
    cacti
    判断端口是否开放
    Linux中运行c程序,与系统打交道
    python 多线程
    Leetcode 编程训练(转载)
  • 原文地址:https://www.cnblogs.com/whistle13326/p/7435549.html
Copyright © 2020-2023  润新知