BZOJ 2502: 清理雪道

标签(空格分隔): OI-BZOJ OI-最小流 OI-上下界网络流


Time Limit: 10 Sec

Memory Limit: 128 MB


Description

滑雪场坐落在FJ省西北部的若干座山上。

从空中鸟瞰,滑雪场可以看作一个有向无环图,每条弧代表一个斜坡(即雪道),弧的方向代表斜坡下降的方向。

你的团队负责每周定时清理雪道。你们拥有一架直升飞机,每次飞行可以从总部带一个人降落到滑雪场的某个地点,然后再飞回总部。从降落的地点出发,这个人可以顺着斜坡向下滑行,并清理他所经过的雪道。

由于每次飞行的耗费是固定的,为了最小化耗费,你想知道如何用最少的飞行次数才能完成清理雪道的任务。

Input

输入文件的第一行包含一个整数n (2 <= n <= 100) – 代表滑雪场的地点的数量。接下来的n行,描述1~n号地点出发的斜坡,第i行的第一个数为mi (0 <= mi < n) ,后面共有mi个整数,由空格隔开,每个整数aij互不相同,代表从地点i下降到地点aij的斜坡。每个地点至少有一个斜坡与之相连。

Output

  1. 输出文件的第一行是一个整数k 直升飞机的最少飞行次数。

Sample Input

8

1 3

1 7

2 4 5

1 8

1 8

0

2 6 5

0

Sample Output

4

HINT

Source

2011福建集训


Solution####

有上下界网络流,弧的下界为1,求最小流


Code####


  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<math.h>
  4. #include<stdlib.h>
  5. #include<string.h>
  6. #include<algorithm>
  7. #include<queue>
  8. using namespace std;
  9. int read()
  10. {
  11. int s=0,f=1;char ch=getchar();
  12. while(!('0'<=ch&&ch<='9')){if(ch=='-')f=-1;ch=getchar();}
  13. while('0'<=ch&&ch<='9'){s=(s<<3)+(s<<1)+ch-'0';ch=getchar();}
  14. return s*f;
  15. }
  16. int S,T,SS,TT,n,m,np;
  17. int A[105],B[105],jr[10005],jc[10005];
  18. int be[100005],bn[200005],bv[200005],bl[200005],bw=1;
  19. void put(int u,int v,int l)
  20. {bw++;bn[bw]=be[u];be[u]=bw;bv[bw]=v;bl[bw]=l;}
  21. int d[100005];
  22. bool spfa(int S,int T)
  23. {
  24. for(int i=1;i<=np;i++)
  25. d[i]=10000000;
  26. d[S]=1;
  27. queue<int>q;
  28. for(q.push(S);!q.empty();)
  29. {int u=q.front();q.pop();
  30. for(int i=be[u],v;i;i=bn[i])
  31. if(d[v=bv[i]]>d[u]+1&&bl[i])
  32. {d[v]=d[u]+1;
  33. q.push(v);
  34. }
  35. }
  36. return d[T]!=10000000;
  37. }
  38. int ans;
  39. int dinic(int u,int mf,int T)
  40. {
  41. if(mf==0)return 0;
  42. if(u==T)return mf;
  43. int sum=0;
  44. for(int i=be[u],v;i;i=bn[i])
  45. if(d[v=bv[i]]==d[u]+1)
  46. {int f=dinic(v,min(mf-sum,bl[i]),T);
  47. bl[i]-=f;
  48. bl[i^1]+=f;
  49. sum+=f;
  50. }
  51. return sum;
  52. }
  53. bool p[101][101];
  54. int main()
  55. {
  56. n=read();
  57. S=++np,T=++np;
  58. for(int i=1;i<=n;i++)
  59. A[i]=++np,
  60. put(S,A[i],1000000),
  61. put(A[i],S,0),
  62. put(A[i],T,1000000),
  63. put(T,A[i],0);
  64. for(int i=1;i<=n;i++)
  65. {int m=read();
  66. for(int j=1,v;j<=m;j++)
  67. v=read(),
  68. put(A[i],A[v],1e9),
  69. put(A[v],A[i],0),
  70. jc[A[i]]++,jr[A[v]]++;
  71. }
  72. SS=++np,TT=++np;
  73. int sumr=0;
  74. for(int i=1;i<=np;i++)
  75. {if(jr[i]-jc[i]>0)put(SS,i,jr[i]-jc[i]),put(i,SS,0),sumr+=jr[i]-jc[i];
  76. else put(i,TT,jc[i]-jr[i]),put(TT,i,0);
  77. }
  78. put(T,S,1e9);
  79. put(S,T,0);
  80. while(spfa(SS,TT))ans+=dinic(SS,1e9,TT);
  81. if(ans<sumr)
  82. {printf("-1\n");return 0;}
  83. ans=bl[bw];
  84. bl[bw]=bl[bw-1]=0;
  85. while(spfa(T,S))ans-=dinic(T,1e9,S);
  86. printf("%d\n",ans);
  87. return 0;
  88. }

BZOJ 2502: 清理雪道的更多相关文章

  1. BZOJ 2502: 清理雪道 [最小流]

    2502: 清理雪道 题意:任意点出发任意次每条边至少经过一次最小花费. 下界1,裸最小流.... #include <iostream> #include <cstdio> ...

  2. bzoj 2502 清理雪道 (有源汇上下界最小流)

    2502: 清理雪道 Time Limit: 10 Sec  Memory Limit: 128 MB Description        滑雪场坐落在FJ省西北部的若干座山上. 从空中鸟瞰,滑雪场 ...

  3. BZOJ 2502 清理雪道(有源汇上下界最小流)

    题面 滑雪场坐落在FJ省西北部的若干座山上. 从空中鸟瞰,滑雪场可以看作一个有向无环图,每条弧代表一个斜坡(即雪道),弧的方向代表斜坡下降的方向. 你的团队负责每周定时清理雪道.你们拥有一架直升飞机, ...

  4. bzoj 2502 清理雪道(有源汇的上下界最小流)

    [题意] 有一个DAG,要求每条边必须经过一次,求最少经过次数. [思路] 有上下界的最小流.  边的下界为1,上界为无穷.构造可行流模型,先不加ts边跑一遍最大流,然后加上t->s的inf边跑 ...

  5. BZOJ 2502: 清理雪道 | 有上下界最小流

    #include<cstdio> #include<algorithm> #include<cstring> #include<queue> #defi ...

  6. bzoj 2502: 清理雪道【有上下界有源汇最小流】

    对于原有边,流区间是(1,inf),按着原边连,然后再连(s,i,(0,inf)),(i,t,(0,inf))表示任意位置进出雪场 按着这个建出新图 然后最小流的方法是先跑可行流,设ans为(t,s, ...

  7. Bzoj 2502: 清理雪道 有上下界网络流_最小流

    好长时间没有写网络流了,感觉好手生.对于本题,设一个源点 $s$ 和 $t$.1.由 $s$ 向每个点连一条没有下界,容量为无限大的边,表示以该点为起点.2.由每个点向 $t$ 连一条没有下界,容量为 ...

  8. BZOJ 2502 清理雪道/ Luogu P4843 清理雪道 (有源汇上下界最小流)

    题意 有一个有向无环图,求最少的路径条数覆盖所有的边 分析 有源汇上下界最小流板题,直接放代码了,不会的看dalao博客:liu_runda 有点长,讲的很好,静心看一定能看懂 CODE #inclu ...

  9. 【BZOJ】2502 清理雪道

    [算法]有源汇上下界最小流 [题解]上下界 初看以为是最小覆盖,发现边可以重复经过,不对. 要求所有边都经过……那就下界为1,上界为inf的可行流. 源汇……S连入度为0的点,T连出度为0的点?(反正 ...

随机推荐

  1. Java:基本语法

    Java语言是由类和对象组成的,其对象和类又是由变量和方法组成,而方法,又包含了语句和表达式. 1. 变量 Java语言提供了两种变量:成员变量和局部变量 成员变量:是在方法体外的类中声明和定义的,可 ...

  2. 老男孩Day1作业(二):三级菜单

    作业需求: 1. 运行程序输出第一级菜单 2. 选择一级菜单某项,输出二级菜单,同理输出三级菜单 3. 菜单数据保存在文件中 4. 让用户选择是否要退出 5. 有返回上一级菜单的功能 1)编写思路 编 ...

  3. 基于rabbitMQ 消息延时队列方案 模拟电商超时未支付订单处理场景

    前言 传统处理超时订单 采取定时任务轮训数据库订单,并且批量处理.其弊端也是显而易见的:对服务器.数据库性会有很大的要求,并且当处理大量订单起来会很力不从心,而且实时性也不是特别好 当然传统的手法还可 ...

  4. 任务计划cron

    在linux中,任务计划分俩:未来时间只执行一次和周期性执行 at:未来时间只执行一次 -V 显示版本信息 -l: 列出指定队列中等待运行的作业:== atq -d: 删除指定的作业:== atrm ...

  5. HTTP/TCP协议基础

    HTTP协议 基本概念 HTTP协议(超文本传输协议 HyperText Transfer Protocol):是用于从WWW服务器传输超文本到本地浏览器的传送协议.它不仅保证计算机正确快速地传输超文 ...

  6. ROS上利用usb_cam读取摄像头图像

    电脑需要有USB3.0的接口 我使用的环境为:Ubuntu16.04LTS ROS版本是kinetic 一.usb_cam驱动的安装 1.创建ROS工作空间 mkdir -p myros/src cd ...

  7. JavaScript刷新页面,不重复提交

    location.replace(location.href);//刷新页面,不重复提交

  8. 从HTML form submit 到 django response是怎么完成的

    HTML form 里的数据是怎么被包成http request 的?如何在浏览器里查看到这些数据? 浏览器做的html数据解析 form里的数据变成name=value对在POST Body中 re ...

  9. 转 oracle数据仓库部署注意事项(OLAP)

    https://blog.csdn.net/laven54/article/details/9840365 最近数据库升级到11G之后,出现一些问题,慢慢的开始发现一些需要总结的东西,每次心里都在想: ...

  10. 04.Spring Ioc 容器 - 刷新

    基本概念 Spring Ioc 容器被创建之后,接下来就是它的初始化过程了.该过程包含了配置.刷新两个步骤 . 刷新由 Spring 容器自己实现,具体发生在 ConfigurableApplicat ...