【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 设备环境句柄(2)
WM_PAINT 消息的触发 Windows 程序在以下情况会触发WM_PAINT消息: 窗口被移动导致被遮盖部分暴露出来 用户调整窗口的大小(当窗口类的 style 字段被设置为 CS_HREDRA ...
- 【JavaScript框架封装】使用Prototype给Array,String,Function对象的方法扩充
/* * @Author: 我爱科技论坛* @Time: 20180705 * @Desc: 实现一个类似于JQuery功能的框架* V 1.0: 实现了基础框架.事件框架.CSS框架.属性框架.内容 ...
- [luogu3237 HNOI2014] 米特运输 (树形dp)
传送门 Description 米特是D星球上一种非常神秘的物质,蕴含着巨大的能量.在以米特为主要能源的D星上,这种米特能源的运输和储存一直是一个大问题. D星上有N个城市,我们将其顺序编号为1到N, ...
- 使用Flask_SQLAlchemy连接多个数据库
#!/usr/bin/env python #-*- coding: utf-8 -*- from flask import Flask from flask_sqlalchemy import SQ ...
- 使用maven创建springMVC时返回页面报错
这是由于你的 Maven 编译级别是 jdk1.5 或以下,而你导入了 jdk1.6 以上的依赖包 解决办法: <build> <finalName></finalNam ...
- listView中adapter有不同的click事件的简单写法
在android中,listview一般都是通过一个adapter来绑定数据,一般的item的点击事件都会指向同一个目标(intent),仅仅是所带的參数不同而已.但有的时候事与愿违,每一个item的 ...
- spark视频教程免费下载
下载地址:点我下载 其它章节陆续上传中,Hadoop视频教程正在整理中,敬请关注.
- Spring Batch(4): Job详解
Spring Batch(4): Job详解 2016-03-26 18:46 870人阅读 评论(1) 收藏 举报 分类: Spring(6) 版权声明:本文为博主原创文章,未经博主允许不得转载 ...
- Codeforces Round #338 (Div. 2) B. Longtail Hedgehog 记忆化搜索/树DP
B. Longtail Hedgehog This Christmas Santa gave Masha a magic picture and a pencil. The picture con ...
- multiset多重集合容器
跟set集合容器相比,multiset多重集合容器也使用红黑树组织元素,仅仅是multiset多重集合容器同意将反复的元素键值插入.元素的搜索依旧具有对数级的算法时间复杂度,find和equal_ra ...