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]\) ...
随机推荐
- python模块typing的作用
一.介绍 Python是一门弱类型的语言,很多时候我们可能不清楚函数参数类型或者返回值类型,很有可能导致一些类型没有指定方法,在写完代码一段时间后回过头看代码,很可能忘记了自己写的函数需要传什么参数, ...
- VS2010-MFC(常用控件:列表视图控件List Control 下)
转自:http://www.jizhuomi.com/software/197.html 上一节是关于列表视图控件List Control的上半部分,简单介绍了列表视图控件,其通知消息的处理和有关结构 ...
- yolo+keras+tensorflow出错:No module named 'leaky_relu'+
结论:keras2.1.5+tensorflow1.6.0即可. 首先出现的是:No module named 'leaky_relu',此时把keras改成2.1.5照样出错,改成keras2.1. ...
- dart 异步
使用异步有两种方法 then 或者 async/await. async/await 方法更易于理解,
- redis服务后台运行
文章目录 进入redis的安装目录 查看目录结构 进入src目录,普通启动效果 编辑redis服务目录下的redis.conf 进入src目录,执行后台运行的命令 检查服务是否开启 进入redis的安 ...
- STM32之glossary
glossary Word: data/instruction of 32-bit length. Half word: data/instruction of 16-bit length. Byte ...
- 面试系列24 dubbo负载均衡策略和集群容错策略
(1)dubbo负载均衡策略 1)random loadbalance 默认情况下,dubbo是random load balance随机调用实现负载均衡,可以对provider不同实例设置不同的权重 ...
- C开发系列-字符串
C语言字符串 C语言字符串本质是使用字符数组来存储的. #include <stdio.h> int main() { "jake"; // "jake&qu ...
- 一个tcp连接可以发多少http请求
-----来自:松若章 -----zhuanlan.zhihu.com/p/61423830 曾经有这么一道经典面试题:从 URL 在浏览器被被输入到页面展现的过程中发生了什么?相信大多数准备过的同学 ...
- ThinkPHP模型基础类提供的连贯操作方法
ThinkPHP模型基础类提供的连贯操作方法(也有些框架称之为链式操作),可以有效的提高数据存取的代码清晰度和开发效率,并且支持所有的CURD操作. 直线电机哪家好 使用也比较简单, 假如我们现在要查 ...