【XSY2692】杨柳 - 网络流
题目来源:2018冬令营模拟测试赛(十)


题解:
继续鬼畜网络流……
首先这题有个显然的做法:bfs预处理出每个起点到每个终点的最短步数,然后直接建边加超级源汇跑费用流即可;
但是这样边数是$n^2$的,时间复杂度正好能过但是很卡常,要写EK才能过;
显然我是不会EK的,所以有一种更优秀的建图方法:
直接在原图点上建边,如果两个点能一步走到就连费用为1,流量为inf的边,建超级源建费用为0,流量为1的边连向所有起点,所有终点同样连向超级汇,直接跑费用流即可……
正确性显然,但是我不是很理解为什么这样会更快……
顺便学习了一波zkw费用流(多路增广是什么?不存在的)
代码:
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#define inf 2147483647
#define eps 1e-9
#define get(x,y) ((x-1)*n+y)
using namespace std;
typedef long long ll;
struct edge{
int v,w,z,next;
}a[];
int way[][];
int n,m,N,aa,b,x,y,cnt=,vs,vt,tot=,tt=,cst=,flow=,ans=,head[],nm[][];
char mp[][];
bool vis[];
void add(int u,int v,int w,int z){
a[++tot].v=v;
a[tot].w=w;
a[tot].z=z;
a[tot].next=head[u];
head[u]=tot;
a[++tot].v=u;
a[tot].w=;
a[tot].z=-z;
a[tot].next=head[v];
head[v]=tot;
}
int aug(int u,int x){
if(u==vt){
ans+=cst*x;
return x;
}
int mxf=x;
vis[u]=true;
for(int tmp=head[u];tmp!=-;tmp=a[tmp].next){
int v=a[tmp].v;
if(a[tmp].w&&!a[tmp].z&&!vis[v]){
int f=aug(v,min(x,a[tmp].w));
a[tmp].w-=f;
a[tmp^].w+=f;
mxf-=f;
if(!mxf)return x;
}
}
return x-mxf;
}
bool lab(){
int mi=inf;
for(int i=vs;i<=vt;i++){
if(vis[i]){
for(int tmp=head[i];tmp!=-;tmp=a[tmp].next){
int v=a[tmp].v;
if(a[tmp].w&&!vis[v]){
mi=min(mi,a[tmp].z);
}
}
}
}
if(mi==inf)return false;
for(int i=vs;i<=vt;i++){
if(vis[i]){
for(int tmp=head[i];tmp!=-;tmp=a[tmp].next){
a[tmp].z-=mi;
a[tmp^].z+=mi;
}
}
}
cst+=mi;
return true;
}
int main(){
memset(head,-,sizeof(head));
scanf("%d%d%d%d%d",&n,&m,&N,&aa,&b);
vs=,vt=n*m+;
way[][]=aa,way[][]=b;
way[][]=aa,way[][]=-b;
way[][]=-aa,way[][]=b;
way[][]=-aa,way[][]=-b;
way[][]=b,way[][]=aa;
way[][]=b,way[][]=-aa;
way[][]=-b,way[][]=aa;
way[][]=-b,way[][]=-aa;
for(int i=;i<=n;i++){
scanf("%s",mp[i]+);
for(int j=;j<=m;j++)nm[i][j]=++cnt;
}
for(int i=;i<=N;i++){
scanf("%d%d",&x,&y);
add(vs,nm[x][y],,);
}
for(int i=;i<=N;i++){
scanf("%d%d",&x,&y);
add(nm[x][y],vt,,);
}
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
if(mp[i][j]=='.'){
for(int k=;k<;k++){
int ii=i+way[k][],jj=j+way[k][];
if(ii&&jj&&ii<=n&&jj<=m&&mp[ii][jj]=='.')add(nm[i][j],nm[ii][jj],inf,);
}
}
}
}
do{
do{
flow+=tt;
memset(vis,,sizeof(vis));
}while(tt=aug(vs,inf));
}while(lab());
printf("%d",flow<N?-:ans);
return ;
}
【XSY2692】杨柳 - 网络流的更多相关文章
- plain framework 1 网络流 缓存数据详解
网络流是什么?为什么网络流中需要存在缓存数据?为什么PF中要采用缓存网络数据的机制?带着这几个疑问,让我们好好详细的了解一下在网络数据交互中我们容易忽视以及薄弱的一块.该部分为PF现有的网络流模型,但 ...
- 网络流模板 NetworkFlow
身边的小伙伴们都在愉快地刷网络流,我也来写一发模板好了. Network Flow - Maximum Flow Time Limit : 1 sec, Memory Limit : 65536 KB ...
- COGS732. [网络流24题] 试题库
«问题描述:假设一个试题库中有n道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性.现要从题库中抽取m 道题组成试卷.并要求试卷包含指定类型的试题.试设计一个满足要求的组卷算法.«编程任务: ...
- ACM/ICPC 之 有流量上下界的网络流-Dinic(可做模板)(POJ2396)
//有流量上下界的网络流 //Time:47Ms Memory:1788K #include<iostream> #include<cstring> #include<c ...
- BZOJ 3144 [Hnoi2013]切糕 ——网络流
[题目分析] 网络流好题! 从割的方面来考虑问题往往会得到简化. 当割掉i,j,k时,必定附近的要割在k-D到k+D上. 所以只需要建两条inf的边来强制,如果割不掉强制范围内的时候,原来的边一定会换 ...
- bzoj3572又TM是网络流
= =我承认我写网络流写疯了 = =我承认前面几篇博文都是扯淡,我写的是垃圾dinic(根本不叫dinic) = =我承认这道题我调了半天 = =我承认我这道题一开始是T的,后来换上真正的dinic才 ...
- hdu3549还是网络流
最后一次训练模板(比较熟练了) 接下来训练网络流的建图 #include <cstdio> #define INF 2147483647 int n,m,ans,x,y,z,M,h,t,T ...
- 二分图&网络流&最小割等问题的总结
二分图基础: 最大匹配:匈牙利算法 最小点覆盖=最大匹配 最小边覆盖=总节点数-最大匹配 最大独立集=点数-最大匹配 网络流: 技巧: 1.拆点为边,即一个点有限制,可将其转化为边 BZOJ1066, ...
- COGS743. [网络流24题] 最长k可重区间集
743. [网络流24题] 最长k可重区间集 ★★★ 输入文件:interv.in 输出文件:interv.out 简单对比时间限制:1 s 内存限制:128 MB «问题描述: «编 ...
随机推荐
- GDI 像素(5)
RGB 颜色 使用 RGB 宏可以创建一个由三个整数值(R.G.B)的 COLORREF 值. COLORREF RGB( BYTE byRed, // 红色值(R) BYTE byGreen, // ...
- 一个很好的JS,ASP二级下拉框联动。
在我们制作网站会员注册信息时,一般会涉及到填写自己所在省/市,如果用input或textarea做成填写形式不太理想.所以大部分网站都会选择联动下来列表形式,做起来也不算很复杂,同时看上去也很轻松. ...
- WEBGL学习【七】画布绘图
主要是对WEBGL的绘图部分进行了进一步加强的认识和理解 <!DOCTYPE HTML> <html lang="en"> <head> < ...
- WEBGL学习【五】纹理贴图
<html lang="zh-CN"> <!--服务器运行地址:http://127.0.0.1:8080/webgl/LearnNeHeWebGL/NeHeWe ...
- flex笔记 - 基础
flex笔记 - 基础 文章中的所有图示代码都放在了github上: 阮一峰flex博客跟学代码 传统的布局解决方案,基于盒模型, 依赖 display, position, float属性来进行布局 ...
- css+div 绘制多边形
/*1.正方形*/ <div id="square"></div> #square { width: 100px; height: 100px; backg ...
- strtotime的一个使用问题
我在开发过程中遇到这么这个问题,因为赶进度,没有记下来处理方案,在鸟哥的博客看到原理分析,很到位!平时开发中总是急着处理问题,没有深入分析和记录问题. 1.问题: 今天是2018-07-31 执行代码 ...
- Windows下通过FTP自动上传和下载动态文件名
某个项目中每天会生成一个以文件名+日期.rar文件,如bcpdata2012-08-31.rar文件,动态的部分为日期部分,在windows环境变量中用 %date:~0,10% 表示,这个文件生成后 ...
- CAD教程----圆的优化命令viewres
CAD软件为了节省内存加快打开图纸的速度,会在显示圆形的时候,用很粗燥的直线表示园,这时我们可以不节省内存,使用viewres将圆形完整的显示出来. 这个值设置的越大,圆越圆(好绕口!)
- spring boot系列--spring security (基于数据库)登录和权限控制
先说一下AuthConfig.java Spring Security的主要配置文件之一 AuthConfig 1 @Configuration 2 @EnableWebSecurity 3 publ ...