和一般的管道不同

不能类似“无限之环”或者“弯弯国”的建图,因为这两个题都是某些位置必须有,或者必须没有

但是本题可以有的位置随意,不能限制某个位置要么流2,要么流0,(实际上可能流了1过去)

所以建图方式不能一样了。

唯一的好处是:只有四种管道。

横的、竖的,所以考虑拆点

法一:

黑白染色

每个点拆成两个点,横、竖

黑色:横->竖,竖->上下的白点的竖,左右白点的横->横

白色:竖->横,横->到左右黑点的横,上下的黑点->竖

必须的就上下界[1,1]否则[0,1]

也即形如:

无源汇上下界最大费用可行流。

求出可行流,在第二步增广的时候,费用<0就break掉

直接跑最大费用最大流得到可行流即可。

PS:可能有正环,需要消圈。[学习笔记]费用流

法二:

考虑连成的若干个环

黑白染色

黑色:横向的是出边,纵向的是入边

白色:纵向的是出边,横向的是入边

然后类似“星际竞速”就可以了

如果一个边不需要选择,就入点直接向出点连边。

最大费用最大流。

之所以可以用“星际竞速”建图来做,因为每个边可以有固定的流向。

且一定一个边入,一个边出,最终成环

#include<bits/stdc++.h>
#define reg register int
#define il inline
#define fi first
#define se second
#define mk(a,b) make_pair(a,b)
#define numb (ch^'0')
#define pb push_back
#define solid const auto &
#define enter cout<<endl
#define pii pair<int,int>
using namespace std;
typedef long long ll;
template<class T>il void rd(T &x){
char ch;x=;bool fl=false;while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);(fl==true)&&(x=-x);}
template<class T>il void output(T x){if(x/)output(x/);putchar(x%+'');}
template<class T>il void ot(T x){if(x<) putchar('-'),x=-x;output(x);putchar(' ');}
template<class T>il void prt(T a[],int st,int nd){for(reg i=st;i<=nd;++i) ot(a[i]);putchar('\n');}
namespace Modulo{
const int mod=;
int ad(int x,int y){return (x+y)>=mod?x+y-mod:x+y;}
void inc(int &x,int y){x=ad(x,y);}
int mul(int x,int y){return (ll)x*y%mod;}
void inc2(int &x,int y){x=mul(x,y);}
int qm(int x,int y=mod-){int ret=;while(y){if(y&) ret=mul(x,ret);x=mul(x,x);y>>=;}return ret;}
template<class ...Args>il int ad(const int a,const int b,const Args &...args) {return ad(ad(a,b),args...);}
template<class ...Args>il int mul(const int a,const int b,const Args &...args) {return mul(mul(a,b),args...);}
}
// using namespace Modulo;
namespace Miracle{
const int N=;
const int inf=0x3f3f3f3f;
const int P=*N*N;
int n,m;
struct node{
int nxt,to;
int w,c;
}e[*(N*N**)];
int hd[P],cnt=;
int num(int i,int j,int t){
return t*n*m+(i-)*m+j;
}
void add(int x,int y,int w,int c){
e[++cnt].nxt=hd[x];
e[cnt].to=y;e[cnt].w=w;e[cnt].c=c;
hd[x]=cnt; e[++cnt].nxt=hd[y];
e[cnt].to=x;e[cnt].w=;e[cnt].c=-c;
hd[y]=cnt;
}
int dis[P],vis[P];
int incf[P],pre[P];
bool lim[N][N];
int s,t;
queue<int>q;
int ans,flow;
bool spfa(){
memset(dis,0xcf,sizeof dis);
dis[s]=;incf[s]=inf;
pre[t]=;
q.push(s);
while(!q.empty()){
int x=q.front();q.pop();
vis[x]=;
for(reg i=hd[x];i;i=e[i].nxt){
int y=e[i].to;
if(e[i].w&&dis[y]<dis[x]+e[i].c){
dis[y]=dis[x]+e[i].c;
pre[y]=i;incf[y]=min(incf[x],e[i].w);
if(!vis[y]){
vis[y]=;
q.push(y);
}
}
}
}
if(!pre[t]) return false;
return true;
}
void upda(){
int x=t;
while(x!=s){
e[pre[x]].w-=incf[t];
e[pre[x]^].w+=incf[t];
x=e[pre[x]^].to;
}
ans+=dis[t]*incf[t];
flow+=incf[t];
}
void clear(){
memset(hd,,sizeof hd);
cnt=;
ans=;flow=;
s=;t=;
memset(lim,,sizeof lim);
}
int main(){
int T;
rd(T);
for(reg o=;o<=T;++o){
rd(n);rd(m);
clear();
s=;t=num(n,m,)+;
int v;
for(reg i=;i<=n;++i){
for(reg j=;j<m;++j){
rd(v);
if((i+j)&){//white
add(num(i,j+,),num(i,j,),,v);
}else{//black
add(num(i,j,),num(i,j+,),,v);
}
}
}
for(reg i=;i<n;++i){
for(reg j=;j<=m;++j){
rd(v);
if((i+j)&){//white
add(num(i,j,),num(i+,j,),,v);
}else{
add(num(i+,j,),num(i,j,),,v);
}
}
}
int k;
rd(k);
int x,y;
for(reg i=;i<=k;++i){
rd(x);rd(y);
lim[x][y]=;
}
for(reg i=;i<=n;++i){
for(reg j=;j<=m;++j){
add(s,num(i,j,),,);
add(num(i,j,),t,,);
if(!lim[i][j]) add(num(i,j,),num(i,j,),,);
}
}
while(spfa()) upda();
printf("Case #%d: ",o);
if(flow==n*m){
printf("%d\n",ans);
}else{
printf("Impossible\n");
}
}
return ;
} }
signed main(){
Miracle::main();
return ;
} /*
Author: *Miracle*
*/

其实两个方法有点类似

都是相当于黑白染色,然后给边定向

法一,通过循环流直接就是环

法二,“星际竞速”图,可以拼成环

China Final J - Mr.Panda and TubeMaster的更多相关文章

  1. ICPC 2016 China Final J. Mr.Panda and TubeMaster【最大费用最大流】

    有一种限制下界强制选的,但是也可以不用 把每个格点拆成两个,一个连s一个连t,对于不是必选的连中间连流量1费用0边表示不选,然后黑白染色,黑点连横着白点连竖着,边权就是这条水管的权值,然后跑最大费用最 ...

  2. 【费用流】 ICPC 2016 China Final J. Mr.Panda and TubeMaster

    表示“必须选”的模型 题目大意 题目分析 一个格子有四种方式看上去很难处理.将横竖两个方向分开考虑,会发现:因为收益只与相邻格子是否连通有关,所以可以将一个格子拆成表示横竖两个方向的,互相独立的点. ...

  3. J - Mr.Panda and TubeMaster

    题解 我们可以把每个格子拆成两个点,一个表示横向的,一个表示纵向的,相邻的格子横向和纵向连边. 如果直接按照题意做的话,我们应当在横向和纵向的点之间连边,有限制的边设下界为1,然后跑可行流. 或者考虑 ...

  4. Gym101194J Mr.Panda and TubeMaster 二分图、费用流

    传送门 看到这张图,是一个网格图,而且有回路限制,不难想到黑白染色. 一般来说我们对一张图黑白染色之后都是黑色点向白色点连边,但是这道题往这边想似乎就想不出建图方法了,因为"一个格子强制流满 ...

  5. 2016 ACM-ICPC China Finals #F Mr. Panda and Fantastic Beasts

    题目链接$\newcommand{\LCP}{\mathrm{LCP}}\newcommand{\suf}{\mathrm{suf}}$ 题意 给定 $n$ 个字符串 $s_1, s_2, \dots ...

  6. 2016EC Final F.Mr. Panda and Fantastic Beasts

    题目大意 \(T(1\leq T\leq42)\)组数据,给定\(n(2\leq n\leq 50000)\)个字符串\(S_{i}(n\leq\sum_{i=1}^{n}S_{i}\leq 2500 ...

  7. 2018 China Collegiate Programming Contest Final (CCPC-Final 2018)-K - Mr. Panda and Kakin-中国剩余定理+同余定理

    2018 China Collegiate Programming Contest Final (CCPC-Final 2018)-K - Mr. Panda and Kakin-中国剩余定理+同余定 ...

  8. hdu6007 Mr. Panda and Crystal 最短路+完全背包

    /** 题目:hdu6007 Mr. Panda and Crystal 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6007 题意:魔法师有m能量,有n ...

  9. ACM ICPC China final G Pandaria

    目录 ACM ICPC China final G Pandaria ACM ICPC China final G Pandaria 题意:给一张\(n\)个点\(m\)条边的无向图,\(c[i]\) ...

随机推荐

  1. for in循环介绍以及陷阱

    大家都知道在JavaScript中提供了两种方式迭代对象: (1)for 循环: (2)for..in循环: 使用for循环进行迭代数组对象,想必大家都已经司空见惯了.但是,使用for.. in循环时 ...

  2. (转)Android--使用Canvas绘图

    转:http://www.cnblogs.com/plokmju/p/android_canvas.html 前言 除了使用已有的图片之外,Android应用常常需要在运行时根据场景动态生成2D图片, ...

  3. Redis-GEO

    一. Redis的GEO特性 Redis3.2版本提供了GEO功能,支持存储地理位置信息用来实现诸如摇一摇,附近位置这类依赖于地理位置信息的功能.二. 命令2.1 增加地理位置信息 命令:geoadd ...

  4. java读取字符串,生成txt文件

    /** * 读取字符串,生成txt 文件 已解决未设置编码时,在项目中直接打开文件,中文乱码问题 * WriteText.writeToText(musicInfo,fileName)直接调用 * * ...

  5. 自己写一个依赖注入容器Container

    前言:在平时的写代码中为了解耦.方便扩展,经常使用一些DI容器(如:Autofac.Unity),那是特别的好用. 关于它的底层实现代码 大概是这样. 一.使用依赖注入的好处 关于使用依赖注入创建对象 ...

  6. Python中好用的模块们

    目录 Python中好用的模块们 datetime模块 subprocess模块 matplotlib折线图 importlib模块 Python中好用的模块们 datetime模块 ​ 相信我们都使 ...

  7. Python第一课-Python的下载与安装

    官网 https://www.python.org/ 我们安装的是windows 系统 Python3和Python2版本不兼容,我们下载最新的Python3.7.4 下载executatable版本 ...

  8. JQ实现全选、全不选

    代码: <table class="table myTable table-hover"> <thead> <tr> <th> &l ...

  9. 【学术篇】oj.jzxx.net2701 无根树

    这是一道来自OIerBBS的题目.. 原帖地址:http://www.oierbbs.com/forum.php?mod=viewthread&tid=512?fromuid=71 (似乎是个 ...

  10. 中国剩余定理模数互质的情况模板(poj1006

    http://poj.org/problem?id=1006 #include <iostream> #include <cstdio> #include <queue& ...