题目来源: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】杨柳 - 网络流的更多相关文章

  1. plain framework 1 网络流 缓存数据详解

    网络流是什么?为什么网络流中需要存在缓存数据?为什么PF中要采用缓存网络数据的机制?带着这几个疑问,让我们好好详细的了解一下在网络数据交互中我们容易忽视以及薄弱的一块.该部分为PF现有的网络流模型,但 ...

  2. 网络流模板 NetworkFlow

    身边的小伙伴们都在愉快地刷网络流,我也来写一发模板好了. Network Flow - Maximum Flow Time Limit : 1 sec, Memory Limit : 65536 KB ...

  3. COGS732. [网络流24题] 试题库

    «问题描述:假设一个试题库中有n道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性.现要从题库中抽取m 道题组成试卷.并要求试卷包含指定类型的试题.试设计一个满足要求的组卷算法.«编程任务: ...

  4. ACM/ICPC 之 有流量上下界的网络流-Dinic(可做模板)(POJ2396)

    //有流量上下界的网络流 //Time:47Ms Memory:1788K #include<iostream> #include<cstring> #include<c ...

  5. BZOJ 3144 [Hnoi2013]切糕 ——网络流

    [题目分析] 网络流好题! 从割的方面来考虑问题往往会得到简化. 当割掉i,j,k时,必定附近的要割在k-D到k+D上. 所以只需要建两条inf的边来强制,如果割不掉强制范围内的时候,原来的边一定会换 ...

  6. bzoj3572又TM是网络流

    = =我承认我写网络流写疯了 = =我承认前面几篇博文都是扯淡,我写的是垃圾dinic(根本不叫dinic) = =我承认这道题我调了半天 = =我承认我这道题一开始是T的,后来换上真正的dinic才 ...

  7. hdu3549还是网络流

    最后一次训练模板(比较熟练了) 接下来训练网络流的建图 #include <cstdio> #define INF 2147483647 int n,m,ans,x,y,z,M,h,t,T ...

  8. 二分图&网络流&最小割等问题的总结

    二分图基础: 最大匹配:匈牙利算法 最小点覆盖=最大匹配 最小边覆盖=总节点数-最大匹配 最大独立集=点数-最大匹配 网络流: 技巧: 1.拆点为边,即一个点有限制,可将其转化为边 BZOJ1066, ...

  9. COGS743. [网络流24题] 最长k可重区间集

    743. [网络流24题] 最长k可重区间集 ★★★   输入文件:interv.in   输出文件:interv.out   简单对比时间限制:1 s   内存限制:128 MB «问题描述: «编 ...

随机推荐

  1. jmeter搭建

    jdk 1.8的地址  链接:https://pan.baidu.com/s/1eEyYbzo1Tfbvbmf_vN2yUA 密码:6dxi 1.安装JDK 选择安装目录 安装过程中会出现两次 安装提 ...

  2. IOS - 绘制文字 drawInRect: withFont: not working

    在图形绘制中,我们经常会需要绘制文本,但我在给PDF上绘制Text时,始终绘制不上, 使用过: [str drawInRect:cubeRect withAttributes:attrs]; CGCo ...

  3. vue项目优化--使用CDN和Gzip

    使用vue-cli构建的vue项目,在打包发布的时候,发现打包后的文件体积很大,使用webpack-bundle-analyzer分析后,发现占用空间最多的是引用的第三方依赖.第三方的依赖文件可以使用 ...

  4. uni-app 之验证码

    手机APP---验证码 最近公司在开发手机APP,app避不可免的就是登录了,emmmm 登录验证码那必须的是有的,我们公司发给我们的图片是酱紫的~~ 这个要求大家应该都能看懂,做这个手机号啊,验证码 ...

  5. 【ACM-ICPC 2018 南京赛区网络预赛 I】Skr

    [链接] 我是链接,点我呀:) [题意] 让你把一个字符串的所有回文子串加起来.(当做数字加起来) 求他们的和. [题解] 回文树. 从两个根节点分别遍历整棵回文树. 按照每个节点的定义. 得到每个节 ...

  6. @Autowired 作用范围

    一.@AutoWired 可以作用于:构造器.方法.参数.属性 二.作用在方法上 @Component public class Student{ private Book book; public ...

  7. 《Python 源码阅读》之 类型Type

    py一切皆对象: 那么Type也是个对象.对象类型叫PyTypeObject demo >>> a = 1 >>> a 1 >>> type(a) ...

  8. POJ 2189

    P是端点,牛在区域中啊... #include <iostream> #include <cstdio> #include <cstring> #include & ...

  9. Advanced Fruits HDU杭电1503【LCS的保存】

    Problem Description The company "21st Century Fruits" has specialized in creating new sort ...

  10. HDU 5654 xiaoxin and his watermelon candy 离线树状数组

    xiaoxin and his watermelon candy Problem Description During his six grade summer vacation, xiaoxin g ...