【BZOJ-2502】清理雪道 有上下界的网络流(有下界的最小流)
2502: 清理雪道
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 594 Solved: 318
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
1 3
1 7
2 4 5
1 8
1 8
0
2 6 5
0
Sample Output
HINT
Source
Solution
有下界的最小流
又题很容易看出,每条边的流至少为1,即下界唯一,总流最小,很显然 下界为1的最小流 无上界或者说上界为inf
不能直接求解,考虑如下:
给每条边加一条下界容量1,一条上界容量inf;
S到各点连边,下界0,上界inf;各点到T连边,下界0,上界inf;
求出最小流就是答案,所以考虑最小流的求法:
添加超级源汇变成 无源汇可行流 ,这就需要连T-->S容量为inf, 这样可以得到满足下界的流量FlowSum,但显然不是所求
去掉原来的S,T,再进行一遍得到Flow,最后的答案,即最小流为FlowSum-Flow
自己是这样理解的:
再求可行流的时候,所得的流量并非全在 (T,S)这条直连路径 上,而同样可能在T-S之间的路径上,所以显然不是最小
那么再做一遍,可以理解为 退流 ,退掉尽可能多的流,由于下界是不会被退掉的,所以差值就是所求最小流
Code
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<vector>
using namespace std;
int read()
{
int x=,f=; char ch=getchar();
while (ch<'' || ch>'') {if (ch=='-') f=-; ch=getchar();}
while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();}
return x*f;
}
#define maxn 500
#define maxm 1000010
int n,m,ind[maxn],S,SS,T,TT;
struct EdgeNode{int to,next,cap;}edge[maxm];
int head[maxn],cnt=;
void add(int u,int v,int w)
{
cnt++;
edge[cnt].to=v;edge[cnt].cap=w;edge[cnt].next=head[u]; head[u]=cnt;
}
void insert(int u,int v,int w) {add(u,v,w); add(v,u,);}
int dis[maxn],que[maxn<<],cur[maxn];
bool bfs()
{
for (int i=; i<=T; i++) dis[i]=-;
que[]=S; dis[S]=; int he=,ta=;
while (he<ta)
{
int now=que[he++];
for (int i=head[now]; i; i=edge[i].next)
if (edge[i].cap && dis[edge[i].to]==-)
dis[edge[i].to]=dis[now]+,que[ta++]=edge[i].to;
}
return dis[T]!=-;
}
int dfs(int loc,int low)
{
if (loc==T) return low;
int w,used=;
for (int i=cur[loc]; i; i=edge[i].next)
if (edge[i].cap && dis[edge[i].to]==dis[loc]+)
{
w=dfs(edge[i].to,min(low-used,edge[i].cap));
edge[i].cap-=w; edge[i^].cap+=w;
used+=w; if (edge[i].cap) cur[loc]=i;
if (used==low) return low;
}
if (!used) dis[loc]=-;
return used;
}
#define inf 0x7fffffff
int dinic()
{
int tmp=;
while (bfs())
{
for (int i=; i<=T; i++) cur[i]=head[i];
tmp+=dfs(S,inf);
}
return tmp;
}
int a[maxn][maxn];
int Work()
{
for (int i=; i<=n; i++)
for (int j=; j<=a[i][]; j++)
insert(i,a[i][j],inf),ind[i]--,ind[a[i][j]]++;
SS=n+; TT=SS+; S=TT+;T=S+;
for(int i=; i<=n; i++)
{
insert(SS,i,inf);
insert(i,TT,inf);
if(ind[i]>) insert(S,i,ind[i]);
else insert(i,T,-ind[i]);
}
insert(TT,SS,inf);
int Flow=,FlowSum=;
Flow=dinic();
FlowSum=edge[cnt].cap;
head[SS]=edge[head[SS]].next;
head[TT]=edge[head[TT]].next;
for (int i=head[S]; i; i=edge[i].next)
edge[i].cap=,edge[i^].cap=;
for (int i=head[T]; i; i=edge[i].next)
edge[i].cap=,edge[i^].cap=;
insert(S,TT,inf); insert(SS,T,inf);
Flow=dinic();
return FlowSum-Flow;
}
int main()
{
n=read();
for (int t,i=; i<=n; i++)
{
a[i][]=read();
for (int j=; j<=a[i][]; j++)
a[i][j]=read();
}
printf("%d\n",Work());
return ;
}
【BZOJ-2502】清理雪道 有上下界的网络流(有下界的最小流)的更多相关文章
- Bzoj 2502: 清理雪道 有上下界网络流_最小流
好长时间没有写网络流了,感觉好手生.对于本题,设一个源点 $s$ 和 $t$.1.由 $s$ 向每个点连一条没有下界,容量为无限大的边,表示以该点为起点.2.由每个点向 $t$ 连一条没有下界,容量为 ...
- BZOJ 2502: 清理雪道 | 有上下界最小流
#include<cstdio> #include<algorithm> #include<cstring> #include<queue> #defi ...
- BZOJ 2502: 清理雪道
BZOJ 2502: 清理雪道 标签(空格分隔): OI-BZOJ OI-最小流 OI-上下界网络流 Time Limit: 10 Sec Memory Limit: 128 MB Descripti ...
- bzoj 2502 清理雪道 (有源汇上下界最小流)
2502: 清理雪道 Time Limit: 10 Sec Memory Limit: 128 MB Description 滑雪场坐落在FJ省西北部的若干座山上. 从空中鸟瞰,滑雪场 ...
- BZOJ 2502: 清理雪道 [最小流]
2502: 清理雪道 题意:任意点出发任意次每条边至少经过一次最小花费. 下界1,裸最小流.... #include <iostream> #include <cstdio> ...
- BZOJ 2502 清理雪道(有源汇上下界最小流)
题面 滑雪场坐落在FJ省西北部的若干座山上. 从空中鸟瞰,滑雪场可以看作一个有向无环图,每条弧代表一个斜坡(即雪道),弧的方向代表斜坡下降的方向. 你的团队负责每周定时清理雪道.你们拥有一架直升飞机, ...
- bzoj 2502 清理雪道(有源汇的上下界最小流)
[题意] 有一个DAG,要求每条边必须经过一次,求最少经过次数. [思路] 有上下界的最小流. 边的下界为1,上界为无穷.构造可行流模型,先不加ts边跑一遍最大流,然后加上t->s的inf边跑 ...
- BZOJ 2502 清理雪道/ Luogu P4843 清理雪道 (有源汇上下界最小流)
题意 有一个有向无环图,求最少的路径条数覆盖所有的边 分析 有源汇上下界最小流板题,直接放代码了,不会的看dalao博客:liu_runda 有点长,讲的很好,静心看一定能看懂 CODE #inclu ...
- bzoj 2502: 清理雪道【有上下界有源汇最小流】
对于原有边,流区间是(1,inf),按着原边连,然后再连(s,i,(0,inf)),(i,t,(0,inf))表示任意位置进出雪场 按着这个建出新图 然后最小流的方法是先跑可行流,设ans为(t,s, ...
随机推荐
- jquery 添加节点的几种方法介绍
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...
- 使用NIFTI指令画nii图像
❤ 关于几种显示工具 mricro:显示出来的左右脑是反着的: mricroN,SPM,xjview,BrainNetViewer:显示出的左右脑是正确的,并且对于做过仿射变换的图像可以自动识别并且校 ...
- VFS分析(二)基本数据结构(持续更新)
nameidata /mnt/dir1/dir2/ nameidata结构体是一个临时的结构体, 目标是为了找到最后的dentry.
- BZOJ 1834 【ZJOI2010】 network 网络扩容
Description 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用.求: 1. 在不扩容的情况下,1到N的最大流: 2. 将1到N的最大流增加K所需的 ...
- android 混淆文件proguard.cfg详解
-optimizationpasses 5 [代码压缩级别]-dontusemixedcaseclassnames [混淆时不会产生形形色色的类名 ]-dontskipnonpubliclibrar ...
- MongoDB JAVA API Filters
Filters 该过滤器类为所有的MongoDB的查询操作静态工厂方法.每个方法返回BSON类型,又可以传递给期望一个查询过滤器的任何方法的一个实例. eq:匹配等于指定值的值.gt:匹配大于指定值的 ...
- Vs2013中通过Nuget添加不同版本jQuery
vs2013中如果直接更新jQuery则是2X的版本,为了兼容IE浏览器的,一般都是希望使用jQuery1.x版本的jQuery,则可在调出Nuget的控制台,在控制台输入(此例子是下载jQuery ...
- HAXM VT-X (与Hype-V冲突)
之前一直使用vs emulator. 感觉性能各方面都比较好, 但在我更新完电脑后不知道什么原因各种起不来... 无奈之下想回到Google自带的模拟器. 然后发现intel haxm一直安装失败. ...
- [MetaHook] Quake FMOD player demo
CFMOD.h #ifndef CFMOD_H #define CFMOD_H #include "qfmod.h" struct Sound_t { char *pszName; ...
- .Net Core+cenos7+Docker+Dockerfile 部署实践
因为这段时间比较忙,同时也在抽时间将开发框架转移到 .net Core 上 所以写博客的时间就少了,这次我利用dockerfile成功将.net Core程序部署到了cenos7容器中,特抽时间把我的 ...