题解

我们可以把每个格子拆成两个点,一个表示横向的,一个表示纵向的,相邻的格子横向和纵向连边。

如果直接按照题意做的话,我们应当在横向和纵向的点之间连边,有限制的边设下界为1,然后跑可行流。

或者考虑用链覆盖的思想,我们把横向点当成入点,纵向点当成出点,然后相邻的入点连向出点。

入点和出点之间连边表示的是如果流这条边,那么这个格子不放,那么有限制的格子就不连这条边。

源点连入点,出点连汇点,最大费用最大流。

代码

#include<bits/stdc++.h>
#define N 2009
#define M 33
#define inf 1e9
using namespace std;
typedef long long ll;
const int xi=-2e8;
queue<int>q;
int head[N],tot,he[M][M],zo[M][M],l[M][M],r[M][M],n,m,num;
int dis[N],fl[N],ans,pre[N],flow;
bool ex[M][M];
bool vis[N];
inline ll rd(){
ll x=0;char c=getchar();bool f=0;
while(!isdigit(c)){if(c=='-')f=1;c=getchar();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
return f?-x:x;
}
struct edge{
int n,to,l,f;
}e[N*10];
inline void add(int u,int v,int l,int f){
e[++tot].n=head[u];e[tot].to=v;head[u]=tot;e[tot].l=l;e[tot].f=f;
e[++tot].n=head[v];e[tot].to=u;head[v]=tot;e[tot].l=0;e[tot].f=-f;
}
inline bool spfa(int s,int t){
memset(dis,-0x3f,sizeof(dis));
q.push(s);dis[s]=0;fl[s]=2e9;
while(!q.empty()){
int u=q.front();q.pop();vis[u]=0;
// cout<<u<<" "<<dis[u]<<endl;
for(int i=head[u];i;i=e[i].n){
int v=e[i].to;
if(e[i].l&&dis[v]<dis[u]+e[i].f){
dis[v]=dis[u]+e[i].f;pre[v]=i;fl[v]=min(fl[u],e[i].l);
if(!vis[v]){vis[v]=1;q.push(v);}
}
}
}
return dis[t]>xi;
}
inline void calc(int s,int t){
int x=t;
while(x!=s){
int i=pre[x];
e[i].l-=fl[t];e[i^1].l+=fl[t];x=e[i^1].to;
}
ans+=dis[t]*fl[t];
flow+=fl[t];
}
inline void solve(){
tot=1;num=0;
n=rd();m=rd();
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)l[i][j]=++num,r[i][j]=++num;
for(int i=1;i<=n;++i)
for(int j=1;j<m;++j)he[i][j]=rd();
for(int i=1;i<n;++i)
for(int j=1;j<=m;++j)zo[i][j]=rd();
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
if((i+j)&1){
if(j<m)add(l[i][j],r[i][j+1],1,he[i][j]);
if(j>1)add(l[i][j],r[i][j-1],1,he[i][j-1]);
}
else{
if(i>1)add(l[i][j],r[i-1][j],1,zo[i-1][j]);
if(i<n)add(l[i][j],r[i+1][j],1,zo[i][j]);
}
}
}
int mm=rd();
for(int i=1;i<=mm;++i){
int x=rd(),y=rd();
ex[x][y]=1;
}
int S=0,T=num+1;
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j){
add(S,l[i][j],1,0);
add(r[i][j],T,1,0);
if(!ex[i][j])add(l[i][j],r[i][j],1,0);
}
while(spfa(S,T))calc(S,T);
if(flow!=n*m)puts("Impossible");
else cout<<ans<<endl;
}
inline void unit(){
memset(ex,0,sizeof(ex));
memset(head,0,sizeof(head));
ans=0;flow=0;
}
int main(){
int T=rd(),tt=0;
while(T--){
++tt;
printf("Case #%d: ",tt);
solve();
unit();
}
return 0;
}

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. China Final J - Mr.Panda and TubeMaster

    和一般的管道不同 不能类似“无限之环”或者“弯弯国”的建图,因为这两个题都是某些位置必须有,或者必须没有 但是本题可以有的位置随意,不能限制某个位置要么流2,要么流0,(实际上可能流了1过去) 所以建 ...

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

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

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

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

  6. 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-中国剩余定理+同余定 ...

  7. H - Mr. Panda and Birthday Song Gym - 101775H (动态规划)

    Mrs. Panda’s birthday is coming. Mr. Panda wants to compose a song as gift for her birthday. It is k ...

  8. Gym 101194C / UVALive 7899 - Mr. Panda and Strips - [set][2016 EC-Final Problem C]

    题目链接: http://codeforces.com/gym/101194/attachments https://icpcarchive.ecs.baylor.edu/index.php?opti ...

  9. UVAL 7902 2016ECfinal F - Mr. Panda and Fantastic Beasts

    题意: 给出n个串,求一个最短的第一个串的子串使它不在其他的n-1个串中出现,若有多个求字典序最小的. Limits: • 1 ≤ T ≤ 42. • 2 ≤ N ≤ 50000. • N ≤ S1 ...

随机推荐

  1. java基础/java调用shell命令和脚本

    一.项目需求: 从某一机构获取证书,证书机构提供小工具,执行.sh脚本即可启动服务,本地调用该服务即可获取证书. 问题:linux服务器启动该服务,不能关闭.一旦关闭,服务即停止. 解决方案:java ...

  2. js 自调函数

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  3. Luogu P1084 [NOIP2012]疫情控制

    题目 首先我们二分一下答案. 然后我们用倍增让军队往上跳,最多先跳到根的子节点. 如果当前军队可以到达根节点,那么记录一下它的编号和它到达根节点后还可以走的时间. 并且我们记录根节点的叶子节点上到根节 ...

  4. Linux菜狗入门(不停更新)

    资料来源:<腾讯课堂> 1, 计算机硬件包括CPU,内存,硬盘,声卡等等 2, 没有安装操作系统的计算机,通常被称为裸机 如果想在裸机上运行自己所编写的程序,就必须用机器语言书写程序 如果 ...

  5. 动态规划: HDU1003Max Sum

    Max Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Su ...

  6. Maven clean install 跳过单元测试

    1.使用MVN命令 mvn clean install -DskipTests 或者 mvn clean install -Dmaven.test.skip=true 2.Eclipse中设置clea ...

  7. Andronov-Hopf bifurcation

    地址:http://www.scholarpedia.org/article/Andronov-Hopf_bifurcation Andronov-Hopf bifurcation is the bi ...

  8. GUI学习之三十一—QLabel学习总结

    前面所有的控件都是归于输入控件的,下面我们要总结下展示控件的用法.首先要将的就是最常用的QLabel. 一.描述  标签控件(QLabel)提供了文本或图像显示的功能,可以用来显示 普通文本 数字 富 ...

  9. 洛谷 P4665 [BalticOI 2015]Network

    洛谷 P4665 [BalticOI 2015]Network 你有一棵 $ n $ 个节点的树,你可以在树上加一些边,使这棵树变成一张无重边.自环的图,且删掉任意一条边它仍然联通.求最少要加多少条边 ...

  10. synchronized和lock的使用分析(优缺点对比详解)

    1.synchronized加同步格式: synchronized(需要一个任意的对象(锁)){ 代码块中放操作共享数据的代码. } synchromized缺陷synchronized是java中的 ...