bzoj2502【有上下界的最大流】
2502: 清理雪道
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 834 Solved: 442
[Submit][Status][Discuss]
Description
Input
输入文件的第一行包含一个整数n (2 <= n <= 100) – 代表滑雪场的地点的数量。接下来的n行,描述1~n号地点出发的斜坡,第i行的第一个数为mi (0 <= mi < n) ,后面共有mi个整数,由空格隔开,每个整数aij互不相同,代表从地点i下降到地点aij的斜坡。每个地点至少有一个斜坡与之相连。
Output
Sample Input
1 3
1 7
2 4 5
1 8
1 8
0
2 6 5
0
Sample Output
HINT
Source
这道题网上所有的解答都是最小流 但是我搞到了一个有上下界的最大流的做法 不知道对不对 求大家来批判
原始建图:
首先设立虚拟源汇S、T,S向每个节点u连一条容量为1的边,下界为0。因为每个点最多空降一次。
每个出度为0的点向汇点连边,容量为+∞
设fx=S -> u 的流量 fe=u -> v 的流量 fE=u->t的流量
设对于点u,流进来的流量为fe1,流出为fe2
由流量平衡得:fe1+fx=fe2+fE
设gx=出度-fx(fx<=出度) ->gx>=0(这里因为从这里滑到终点的次数不会比出度多)
gE=入度-fE(fE<=入度)->gE>=0(同上)
ge1=fe1-1 ge2=fe2-1
由fe1+fe=fe2+fE推出ge1+1+出度-gx=ge2+1+入度-fE
ge1+入度+出度-gx=ge2+入度+出度-gE
ge1-gx=ge2-gE ge1+gE=ge2+gx
这个东西满足流量平衡 然后我们跑一遍有上下界的最大流就可以了。
代码未填坑
这是最小流的代码
#include<bits/stdc++.h>
using namespace std;
const int N = , inf = << ;
struct edge {
int nxt, to, f;
} e[];
int n, cnt = , SS, TT, ans, T, tot;
int head[N], d[N], q[N], in[N], iter[N];
void link(int u, int v, int f)
{
e[++cnt].nxt = head[u];
head[u] = cnt;
e[cnt].to = v;
e[cnt].f = f;
}
void ins(int u, int v, int f) { link(u, v, f); link(v, u, ); }
bool bfs()
{
int l = , r = ;
memset(d, , sizeof(d));
q[++r] = SS; d[SS] = ;
while(l <= r)
{
int u = q[l++];
for(int i = head[u]; i; i = e[i].nxt) if(e[i].f && !d[e[i].to])
{
d[e[i].to] = d[u] + ;
q[++r] = e[i].to;
}
}
return d[TT] > ;
}
int dfs(int u, int delta)
{
if(u == TT) return delta;
int ret = ;
for(int &i = iter[u]; i && delta; i = e[i].nxt) if(e[i].f && d[e[i].to] == d[u] + )
{
int x = dfs(e[i].to, min(delta, e[i].f));
e[i].f -= x; e[i ^ ].f += x;
delta -= x; ret += x;
}
return ret;
}
void dinic()
{
while(bfs())
{
for(int i = ; i <= TT; ++i) iter[i] = head[i];
ans += dfs(SS, inf);
}
}
int main()
{
scanf("%d", &n);
T = n + ; SS = n + ; TT = n + ;
for(int i = ; i <= n; ++i)
{
int m;
ins(, i, inf);
scanf("%d", &m);
if(!m) ins(i, T, inf);
for(int j = ; j <= m; ++j)
{
int u; scanf("%d", &u); ++tot;
--in[i]; ++in[u];
ins(i, u, inf);
}
}
for(int i = ; i <= T; ++i)
{
if(in[i] > ) ins(SS, i, in[i]);
else ins(i, TT, -in[i]);
}
dinic();
ins(n + , , inf);
dinic();
printf("%d\n", inf - e[cnt ^ ].f);
return ;
}
bzoj2502【有上下界的最大流】的更多相关文章
- HDU Destroy Transportation system(有上下界的可行流)
前几天正看着网络流,也正研究着一个有上下界的网络流的问题,查看了很多博客,觉得下面这篇概括的还是相当精确的: http://blog.csdn.net/leolin_/article/details/ ...
- ZOJ 2314 带上下界的可行流
对于无源汇问题,方法有两种. 1 从边的角度来处理. 新建超级源汇, 对于每一条有下界的边,x->y, 建立有向边 超级源->y ,容量为x->y下界,建立有向边 x-> 超级 ...
- 【UVALive - 5131】Chips Challenge(上下界循环费用流)
Description A prominent microprocessor company has enlisted your help to lay out some interchangeabl ...
- SGU 176.Flow construction (有上下界的最大流)
时间限制:0.5s 空间限制:4M 题意: 有一个由管道组成的网络,有n个节点(n不大于100),1号节点可以制造原料,最后汇集到n号节点.原料通过管道运输.其中有一些节点有管道连接,这些管道都有着最 ...
- zoj3229 Shoot the Bullet(有源汇有上下界的最大流)
题意: 一个屌丝给m个女神拍照,计划拍照n天,每一天屌丝给给定的C个女神拍照,每天拍照数不能超过D张,而且给每个女神i拍照有数量限制[Li,Ri],对于每个女神n天的拍照总和不能少于Gi,如果有解求屌 ...
- zoj 3229 有源汇有上下界的最大流模板题
/*坑啊,pe的程序在zoj上原来是wa. 题目大意:一个屌丝给m个女神拍照.计划拍照n天,每一天屌丝最多个C个女神拍照,每天拍照数不能超过D张,并且给每一个女神i拍照有数量限制[Li,Ri], 对于 ...
- LOJ #116 有源汇点有上下界的最大流
先连一条从汇点到源点的容量为INF的边,将其转化成无源汇点有上下界的可行流,判断是否可行 若可行的话删掉超级源点和超级汇点,再跑一遍最大流即可 #include <iostream> #i ...
- [ACdream 1211 Reactor Cooling]无源无汇有上下界的可行流
题意:无源无汇有上下界的可行流 模型 思路:首先将所有边的容量设为上界减去下界,然后对一个点i,设i的所有入边的下界和为to[i],所有出边的下界和为from[i],令它们的差为dif[i]=to[i ...
- 【BZOJ-4213】贪吃蛇 有上下界的费用流
4213: 贪吃蛇 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 58 Solved: 24[Submit][Status][Discuss] Desc ...
随机推荐
- [luoguP3258] [JLOI2014]松鼠的新家(lca + 树上差分)
传送门 需要把一条路径上除了终点外的所有数都 + 1, 比如,给路径 s - t 上的权值 + 1,可以先求 x = lca(s,t) 类似数列上差分的思路,可以给 s 和 f[t] 的权值 + 1, ...
- POJ 2391 Ombrophobic Bovines【二分 网络流】
题目大意:F个草场,P条道路(无向),每个草场初始有几头牛,还有庇护所,庇护所有个容量,每条道路走完都有时间,问所有奶牛都到庇护所最大时间最小是多少? 思路:和POJ2112一样的思路,二分以后构建网 ...
- 数字游戏(codevs 1085)
题目描述 Description 丁丁最近沉迷于一个数字游戏之中.这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易.游戏是这样的,在你面前有一圈整数(一共 ...
- Codevs 2693 上学路线(施工)
时间限制: 2 s 空间限制: 16000 KB 题目等级 : 黄金 Gold 题目描述 Description 问题描述 你所在的城市街道好像一个棋盘,有a条南北方向的街道和b条东西方向的街道. 南 ...
- BZOJ1698: [Usaco2007 Feb]Lilypad Pond 荷叶池塘
一傻逼题调了两天.. n<=30 * m<=30的地图,0表示可以放平台,1表示本来有平台,2表示不能走,3起点4终点,走路方式为象棋的日字,求:从起点走到终点,至少要放多少平台,以及放平 ...
- msp430项目编程20
msp430中项目---超声波测距系统 1.定时器工作原理 2.电路原理说明 3.代码(显示部分) 4.代码(功能实现) 5.项目总结 msp430项目编程 msp430入门学习
- python学习之 - 时间模块
时间模块模块名:time时间模块的转换流程图. UTC:英国格林威治时间.时间戳作用:是用来进行时间计算的.进行加减时间.注意:时间计算是用秒为单位time.process_time():测量处理器运 ...
- hdu6080(最小环)
题目 http://acm.hdu.edu.cn/showproblem.php?pid=6080 分析 很妙的思路,将里面的点集当作A,将外面的点集当作B 然后O(n^2)枚举两两B点,设一个是u, ...
- JVM(零):走入JVM
JVM(零):走入JVM 本系列主要讲述JVM相关知识,作为本系列的第一篇文章,本文从Java为什么是一个跨平台的语音开始介绍,逐步引入Java虚拟机的概念,并给出一个JVM相关知识图谱,可以让读者从 ...
- 09-js数组常用方法
<html> <head> <title>js数组的常用操作</title> <meta charset="UTF-8"/&g ...