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\n",ans);
53     return 0;
54 }
55 
56 int sb=hh();
57 int main(int argc,char**argv) {;}
代码

 

转载于:https://www.cnblogs.com/whistle13326/p/7435549.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值