2502: 清理雪道

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 1218  Solved: 663
[Submit][Status][Discuss]

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

DAG用最少的路径覆盖所有的点:最长反链(复杂度O(n^3))

而这题是DAG用最少的路径覆盖所有的边,如果把边当成点的话复杂度就为O(m^3)会TLE

考虑带上下界的网络流

看了网上所有题解都是求两次网络流再相减,其实根本没有必要,只要1次就OK了,并且建的边的也少很多

建边方式如下:

初始化ans=0

①存在边(u, v)那么u到v连接一条流量无穷大的边

②对于点u,和一般带下界的网络流处理方法一样,设u点入度为in[u],出度为out[u],x=in[u]-out[u]

如果x<0,那么从u向汇点T连接一条流量为|x|的边,中间ans += |x|

如果x>0,那么从源点S向u连接一条流量为x的边

最后答案就是ans - S到T的最大流

OK!

为什么这是对的呢?给出一个简要证明

一个很简单但错误的思路是如果一个点的入度<出度,那么答案就一定要加上这个点的出度-入度

也就是说ans = ∑max(out[u]-in[u], 0)  (u∈G)(正好就是上面红色的ans!)

很好想到但其实是有反例的如下图:

(自己脑补)

而考虑带上下界网络流方法的证明:对于一条下界为1的边(u, v),操作②就同等于直接把这条边删掉,只要保证最后u点会多出1点流量,v点少1点流量就OK,可是怎么样才能保证呢?那就连一条u到汇点容量为1的边,再连一条源点到v点的边并保证这两条边满流!

而刚好如果这两条边满流了正说明可以在不引入额外流量的情况下满足点u和点v互补,从而流量总和+1,ans-1

#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<queue>
using namespace std;
int n, m, cnt, S, T, head[2005], h[2005], cur[2005], in[2005], out[2005];
typedef struct
{int to, next;int flow;
}Road;
Road G[20005];
void Add(int u, int v, int flow)
{cnt++;G[cnt].next = head[u];head[u] = cnt;G[cnt].to = v;G[cnt].flow = flow;
}
int Jud()
{int now, i;queue<int> q;memset(h, -1, sizeof(h));q.push(S);h[S] = 0;while(q.empty()==0){now = q.front();q.pop();for(i=head[now];i!=0;i=G[i].next){if(G[i].flow && h[G[i].to]==-1){h[G[i].to] = h[now]+1;q.push(G[i].to);}}}if(h[T]!=-1)return 1;return 0;
}
int Sech(int x, int flow)
{int w, used, i;if(x==T)return flow;used = 0;for(i=cur[x];i!=0;i=G[i].next){if(h[G[i].to]==h[x]+1){w = Sech(G[i].to, min(flow-used, G[i].flow));G[i].flow -= w;G[i^1].flow += w;if(G[i].flow)cur[x] = i;used += w;if(used==flow)return flow;}}if(used==0)h[x] = -1;return used;
}
int Dinic()
{int i, flow = 0;while(Jud()){for(i=S;i<=T;i++)cur[i] = head[i];flow += Sech(S, 1<<25);}return flow;
}
int main(void)
{int n, i, m, x, ans;cnt = 1;scanf("%d", &n);for(i=1;i<=n;i++){scanf("%d", &m);while(m--){scanf("%d", &x);in[x]++, out[i]++;Add(i, x, 1<<25);Add(x, i, 0);}}S = 0, T = n+1;ans = 0;for(i=1;i<=n;i++){if(in[i]-out[i]<0){Add(i, T, out[i]-in[i]);ans += out[i]-in[i];Add(T, i, 0);}else{Add(S, i, in[i]-out[i]);Add(i, S, 0);}}printf("%d\n", ans-Dinic());return 0;
}

bzoj 2502: 清理雪道(有下界的最小流)相关推荐

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

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

  2. [BZOJ2502]清理雪道解题报告|带下界的最小流

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

  3. 有上下界网络流 ---- P4843 清理雪道(DAG图上最小路径重复边覆盖)【模板】有源汇上下界最小流

    题目链接 题目大意: 解题思路: 首先我们发现对于每条边至少要覆盖一次,最多覆盖无数次 那么就有点像上下界网络流了[1,INF][1,INF][1,INF]的限制关系 跑一边最小流就可以了!! #in ...

  4. SGU-176 Flow construction 有上下界的最小流

    这里参看了大牛的解题思路,学习了很多.原来上下界流的求法是这么的灵活,尤其我是用的临界表存储的边,删除更新很不方便. http://www.shuizilong.com/house/archives/ ...

  5. POJ 3801/HDU 3157 Crazy Circuits | 有下界的最小流

    题目: POJ最近总是炸 所以还是用HDU吧http://acm.hdu.edu.cn/showproblem.php?pid=3157 题解: 题很长,但其实就是给个有源汇带下界网络流(+是源,-是 ...

  6. LOJ - #117. 有源汇有上下界最小流(有源汇有上下界的最小流)

    题目链接:点击查看 题目大意:给出一个 n 个点和 m 条边的有向图,每条边都有一个流量限制 [ lower , upper ],给定源点 s 和汇点 t ,求出源点到汇点的最小流 题目分析:参考我的 ...

  7. hust1342(流量有上下界的最小流)

    题意: 给出一个有向无环图(DAG),我们规定有一些边是必须走的,当走到一个出度是0的点时,我们可以瞬移到任何一个我们想去的点,自选起点,走遍所有的必须走的边,使得瞬移次数最少. 思路: 这类题完全没 ...

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

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

  9. HDU 3157 Crazy Circuits(有源汇上下界最小流)

    HDU 3157 Crazy Circuits 题目链接 题意:一个电路板,上面有N个接线柱(标号1~N),还有两个电源接线柱 + -.给出一些线路,每一个线路有一个下限值求一个能够让全部部件正常工作 ...

最新文章

  1. python yield用法举例说明
  2. python中控制台输出的颜色方法
  3. 将IDE检查应用于自定义Java批注
  4. Perl 中级教程 第5章课后习题
  5. scrumndash;yesterday once more
  6. 同一个闭区间上有界变差函数的和与积都是有界变差函数
  7. 虚拟机访问本地mysql_如何在本地远程连接linux虚拟机上面的mysql
  8. 小饼叮当 最爱铜锣烧
  9. When executing step qmake
  10. java求三角形的面积_java编程中求三角形面积怎么写?
  11. set工具集的基础使用
  12. 网络安全工程师面试总结
  13. 计算机中什么是数组公式,学会就能效率翻倍的数组公式,到底怎么用?
  14. android killer java,记录Android Killer反编译时遇到的异常
  15. 哪些iPhone具有纵向模式?
  16. h5拍照添加水印上传
  17. 手柄映射键盘_创新设计的多模手柄,北通宙斯T6精英机械游戏手柄体验点评
  18. bzoj 4408: [FJOI2016]神秘数 主席树
  19. QT 文本html显示格式的问题,如在QTextBrowser.setText用tr(),其中为html格式
  20. VC 控件背景透明、文字背景透明

热门文章

  1. python发音翻译-python实现在线翻译
  2. 如何自学python知乎-初次接触python,怎么样系统的自学呢?
  3. python手机版-python做app
  4. 语音识别如何操作?这种语音转文字方法也太好用了吧,简单高效
  5. JavaScript-输入输出语法
  6. 2017蓝桥杯结果填空:迷宫
  7. Codeforces Round #753 (Div. 3)E. Robot on the Board 1
  8. YUV通过MediaCodec编码H264
  9. LIRe 源代码分析 5:提取特征向量[以颜色布局为例]
  10. 四位共阳极数码管显示函数_初学者,求助!!设计一个4位LED数码管动态扫描显示电路,用...