China Final J - Mr.Panda and TubeMaster

和一般的管道不同
不能类似“无限之环”或者“弯弯国”的建图,因为这两个题都是某些位置必须有,或者必须没有
但是本题可以有的位置随意,不能限制某个位置要么流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的更多相关文章
- ICPC 2016 China Final J. Mr.Panda and TubeMaster【最大费用最大流】
有一种限制下界强制选的,但是也可以不用 把每个格点拆成两个,一个连s一个连t,对于不是必选的连中间连流量1费用0边表示不选,然后黑白染色,黑点连横着白点连竖着,边权就是这条水管的权值,然后跑最大费用最 ...
- 【费用流】 ICPC 2016 China Final J. Mr.Panda and TubeMaster
表示“必须选”的模型 题目大意 题目分析 一个格子有四种方式看上去很难处理.将横竖两个方向分开考虑,会发现:因为收益只与相邻格子是否连通有关,所以可以将一个格子拆成表示横竖两个方向的,互相独立的点. ...
- J - Mr.Panda and TubeMaster
题解 我们可以把每个格子拆成两个点,一个表示横向的,一个表示纵向的,相邻的格子横向和纵向连边. 如果直接按照题意做的话,我们应当在横向和纵向的点之间连边,有限制的边设下界为1,然后跑可行流. 或者考虑 ...
- Gym101194J Mr.Panda and TubeMaster 二分图、费用流
传送门 看到这张图,是一个网格图,而且有回路限制,不难想到黑白染色. 一般来说我们对一张图黑白染色之后都是黑色点向白色点连边,但是这道题往这边想似乎就想不出建图方法了,因为"一个格子强制流满 ...
- 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 ...
- 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 ...
- 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-中国剩余定理+同余定 ...
- hdu6007 Mr. Panda and Crystal 最短路+完全背包
/** 题目:hdu6007 Mr. Panda and Crystal 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6007 题意:魔法师有m能量,有n ...
- ACM ICPC China final G Pandaria
目录 ACM ICPC China final G Pandaria ACM ICPC China final G Pandaria 题意:给一张\(n\)个点\(m\)条边的无向图,\(c[i]\) ...
随机推荐
- 计数dp+概率+大数——(抽屉问题解的个数)zoj3380
难的地方在于计数dp..给定范围[1,n]的数去填m个位置,要求不能出现超过I个相同的数, 那就用dp[i][j]表示在阶段i,已经填了j个位置的可能解法,那么只要枚举i填的位置数k∈[0,min(j ...
- LUOGU P3919 【模板】可持久化数组(主席树)
传送门 解题思路 给每一时刻建一棵线段树维护当前时刻的值,然后修改的时候直接修改,查询的时候直接查,记住查询完后一定要复制. 代码 #include<iostream> #include& ...
- LUOGU P3161 [CQOI2012]模拟工厂 (贪心)
传送门 解题思路 贪心,首先因为\(n\)比较小,可以\(2^n\)枚举子集.然后判断的时候就每次看后面的如果用最大生产力生产能不能达成目标,解一个二次函数. 代码 #include<iostr ...
- Vue-组件详解
转载:https://segmentfault.com/a/1190000015199363 查看原文站点,更多扩展内容及更佳阅读体验! 组件详解 组件与复用 Vue组件需要注册后才可以使用.注册有全 ...
- 响应式编程(Reactive Programming)(Rx)介绍
很明显你是有兴趣学习这种被称作响应式编程的新技术才来看这篇文章的. 学习响应式编程是很困难的一个过程,特别是在缺乏优秀资料的前提下.刚开始学习时,我试过去找一些教程,并找到了为数不多的实用教程,但是它 ...
- 19.SimLogin_case01
什么是模拟登录? 要抓取的信息,只有在登录之后才能查看.这种情况下,就需要爬虫做模拟登录,绕过登录页. cookies和session的区别: cookie数据存放在客户的浏览器上,session数据 ...
- 使用maven搭建Hibernate
使用maven搭建Hibernate框架(web项目) create table USERS ( ID NUMBER not null primary key, NAME ), PASSWORD ), ...
- Homebrew(brew)安装MySQL@5.7及配置
查找并确定自己需要安装的版本 brew search mysql ==> Formulae automysqlbackup mysql-connector-c mysql@5.5 mysql m ...
- 靖烜小哥哥之mybatis总结
MyBatis是一个半自动映射的框架.“半自动”是相对于Hibernate全表映射而言的,MyBatis需要手动匹配提供POJO.SQL和映射关系,而Hibernate只需提供POJO和映射关系即可. ...
- JQuery和JavaScript常用方法的一些区别
jquery 就对javascript的一个扩展,封装,就是让javascript更好用,更简单,为了说明区别,下面与大家分享下JavaScript 与JQuery 常用方法比较 jquery 就 ...