Description

       滑雪场坐落在FJ省西北部的若干座山上。
从空中鸟瞰,滑雪场可以看作一个有向无环图,每条弧代表一个斜坡(即雪道),弧的方向代表斜坡下降的方向。
你的团队负责每周定时清理雪道。你们拥有一架直升飞机,每次飞行可以从总部带一个人降落到滑雪场的某个地点,然后再飞回总部。从降落的地点出发,这个人可以顺着斜坡向下滑行,并清理他所经过的雪道。
由于每次飞行的耗费是固定的,为了最小化耗费,你想知道如何用最少的飞行次数才能完成清理雪道的任务。
 

Input

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

Output

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

Sample Input

8
1 3
1 7
2 4 5
1 8
1 8
0
2 6 5
0

Sample Output

4

Solution

每条边的流量界限为$[1,INF]$。 拓扑图的起点和$s$连一下,终点和$t$连一下,上下界为$[0,INF]$。

跑一遍最小流就完事了……

Code

  1. #include<iostream>
  2. #include<cstring>
  3. #include<cstdio>
  4. #include<queue>
  5. #define N (209)
  6. #define INF (0x7f7f7f7f)
  7. using namespace std;
  8.  
  9. struct Edge{int to,next,flow;}edge[N*N];
  10. int n,m,x,vis[N];
  11. int s,t,ss=,tt=,Depth[N],A[N];
  12. int head[N],num_edge;
  13. queue<int>q;
  14.  
  15. inline int read()
  16. {
  17. int x=,w=; char c=getchar();
  18. while (!isdigit(c)) {if (c=='-') w=-; c=getchar();}
  19. while (isdigit(c)) x=x*+c-'', c=getchar();
  20. return x*w;
  21. }
  22.  
  23. void add(int u,int v,int l)
  24. {
  25. edge[++num_edge].to=v;
  26. edge[num_edge].next=head[u];
  27. edge[num_edge].flow=l;
  28. head[u]=num_edge;
  29. }
  30.  
  31. void Add(int u,int v,int l,int r)
  32. {
  33. add(u,v,r-l); add(v,u,);
  34. A[u]-=l; A[v]+=l;
  35. }
  36.  
  37. int DFS(int x,int low,int t)
  38. {
  39. if (x==t || !low) return low;
  40. int f=;
  41. for (int i=head[x]; i; i=edge[i].next)
  42. if (Depth[edge[i].to]==Depth[x]+)
  43. {
  44. int Min=DFS(edge[i].to,min(low,edge[i].flow),t);
  45. edge[i].flow-=Min;
  46. edge[((i-)^)+].flow+=Min;
  47. f+=Min; low-=Min;
  48. if (!low) break;
  49. }
  50. if (!f) Depth[x]=-;
  51. return f;
  52. }
  53.  
  54. bool BFS(int s,int t)
  55. {
  56. memset(Depth,,sizeof(Depth));
  57. Depth[s]=; q.push(s);
  58. while (!q.empty())
  59. {
  60. int x=q.front(); q.pop();
  61. for (int i=head[x]; i; i=edge[i].next)
  62. if (!Depth[edge[i].to] && edge[i].flow)
  63. {
  64. Depth[edge[i].to]=Depth[x]+;
  65. q.push(edge[i].to);
  66. }
  67. }
  68. return Depth[t];
  69. }
  70.  
  71. int Dinic(int s,int t)
  72. {
  73. int ans=;
  74. while (BFS(s,t)) ans+=DFS(s,INF,t);
  75. return ans;
  76. }
  77.  
  78. int main()
  79. {
  80. n=read(); s=; t=n+;
  81. for (int i=; i<=n; ++i)
  82. {
  83. m=read();
  84. if (!m) Add(i,t,,INF);
  85. for (int j=; j<=m; ++j)
  86. vis[x=read()]=, Add(i,x,,INF);
  87. }
  88. for (int i=; i<=n; ++i) if (!vis[i]) Add(s,i,,INF);
  89. int sum=;
  90. for (int i=; i<=n+; ++i)
  91. if (A[i]>) sum+=A[i], add(ss,i,A[i]), add(i,ss,);
  92. else add(i,tt,-A[i]), add(tt,i,);
  93. add(t,s,INF); add(s,t,);
  94. Dinic(ss,tt);
  95. for (int i=head[ss]; i; i=edge[i].next) edge[i].flow=edge[((i-)^)+].flow=;
  96. for (int i=head[tt]; i; i=edge[i].next) edge[i].flow=edge[((i-)^)+].flow=;
  97. int flow0=edge[num_edge].flow;
  98. edge[num_edge-].flow=edge[num_edge].flow=;
  99. printf("%d\n",flow0-Dinic(t,s));
  100. }

BZOJ2502:清理雪道(有上下界最小流)的更多相关文章

  1. 【bzoj2502】清理雪道 有上下界最小流

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

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

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

  3. [BZOJ2502]清理雪道 有上下界网络流(最小流)

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

  4. BZOJ_2502_清理雪道_有源汇上下界最小流

    BZOJ_2502_清理雪道_有源汇上下界最小流 Description        滑雪场坐落在FJ省西北部的若干座山上. 从空中鸟瞰,滑雪场可以看作一个有向无环图,每条弧代表一个斜坡(即雪道), ...

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

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

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

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

  7. BZOJ 1458 / Luogu P4311 士兵占领 (上下界最小流 / 直接最大流)

    做法1:上下界最小流 先来一发上下界最小流,思路比较暴力,就是把行和列看作n+mn+mn+m个点,(i,j)(i,j)(i,j)如果能占领就从第iii行向第jjj列连一条边,上界为1下界为0;然后从s ...

  8. P4843 清理雪道(上下界网络流)

    P4843 清理雪道 上下界最小流 我们先搞一遍上下界可行流(转) 回忆上下界最大流的写法:在可行流的残量网络$s\ -\ t$上跑最大流,答案为可行流$+$残量网络的最大流 那么上下界最小流的写法呢 ...

  9. sgu 176 Flow construction(有源汇的上下界最小流)

    [题目链接] http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=11025 [模型] 有源汇点的上下界最小流.即既满足上下界又满足 ...

随机推荐

  1. C#:ORM--实体框架EF(entity framework)(2)

    有三种不同的模式可以在您的应用中使用EF框架 Database First Code First ModelFirst Db-First 在DbFirst时,你使用VS中的EDM向导或使用EF命令来从 ...

  2. SQL脚本修改数据库名称

    USE master; GO DECLARE @SQL VARCHAR(MAX); SET @SQL='' SELECT @SQL=@SQL+'; KILL '+RTRIM(SPID) FROM ma ...

  3. 学习Memcached:2基本应用之控制台使用

    1.首先新建一个控制台应用. 2.将下载好需要引用的Memcached的Dll导入进来. 3.前期准备工作就结束了,其实很简单,memcache的配置使用是挺简单.下面就是写代码了. using Me ...

  4. sqlserver--install/uninstall

    2017 express版本 安装: https://jingyan.baidu.com/article/76a7e409077997fc3a6e1559.html https://www.cnblo ...

  5. Java枚举的下标值

    java中枚举值下标默认从0开始,可以用ordinal()这个方法获取下标值. public enum Sex { MALE(1,"男"),FEMALE(2,"女&quo ...

  6. django-templates过滤器

    常用内置过滤器: 过滤器会更改量或便签参数的值: title过滤器: {{ django|title }} 在下列context中 {'django': 'the web framework for ...

  7. kotlin-2(IdeaIU-2018.2汉化破解)

    1.下载文件包: 链接:https://pan.baidu.com/s/1AaAqkJ5E88k69dhcDiC0tA 提取码:b5uk 2.点击ideaIU-2018.2安装软件,安装完成后,不要点 ...

  8. SD从零开始31-32

    SD从零开始31 包装(Packing) 装运材料Shipping Materials Shipping materials是用来包装或者运输货物的材料: 为了在系统中为outbound delive ...

  9. Oracle查询时15分钟划分

    select to_date(to_char(sysdate, 'yyyy-MM-dd hh24') || ':' ||               floor(to_number(to_char(s ...

  10. 活字格Web应用平台学习笔记2-基础教程-开始

    今天先学活字格第一个教程,开始. 目标是能够用活字格创建一个简单的Web页面. 哈哈,简单,跟Excel一样,做单元格输入.合并.文字居中.加底色.加图片,然后发布. 然后就真的生成了一个Web页面! ...