【Luogu】P3159交换棋子(超出我能力范围的费用流)
明显超出我能力范围。
只放题解。
再放代码。
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cctype>
#include<queue>
#define maxn 100200
using namespace std;
inline long long read(){
long long num=,f=;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') f=-;
ch=getchar();
}
while(isdigit(ch)){
num=num*+ch-'';
ch=getchar();
}
return num*f;
} int n,m;
inline int calc(int x,int y,int z){ return (x-)*m+y+(z-)*(n*m); }
inline int count(int i){ return i&?i+:i-; }
struct Edge{
int from,next,to,dis,val,flow;
}edge[maxn];
int head[maxn],num;
inline void addedge(int from,int to,int dis,int val){
edge[++num]=(Edge){from,head[from],to,dis,val,};
head[from]=num;
}
inline void add(int from,int to,int dis,int val){
addedge(from,to,dis,val);
addedge(to,from,-dis,);
} bool sta[][];
bool edn[][];
int swa[][];
int Start,End; int u[]={,,,,,,-,-,-};
int w[]={,,,,-,-,-,,}; struct Ans{
long long dis,val;
Ans(){dis=val=;}
}; long long dis[maxn];
long long pre[maxn];
int flow[maxn];
bool vis[maxn];
int sum; Ans spfa(){
Ans ans;
memset(dis,/,sizeof(dis)); long long Max=dis[];
dis[Start]=; flow[Start]=0x7fffffff;
queue<int>q; q.push(Start);
while(!q.empty()){
int from=q.front();q.pop();vis[from]=;
for(int i=head[from];i;i=edge[i].next){
int to=edge[i].to;
if(edge[i].dis+dis[from]>=dis[to]||edge[i].val==edge[i].flow) continue;
dis[to]=dis[from]+edge[i].dis;
pre[to]=i;
flow[to]=min(flow[from],edge[i].val-edge[i].flow);
if(!vis[to]){
vis[to]=;
q.push(to);
}
}
}
if(dis[End]==Max) return ans;
long long now=End; ans.val=flow[End]; ans.dis=dis[End];
sum+=flow[End];
while(now!=Start){
long long ret=pre[now];
edge[ret].flow+=flow[End];
edge[count(ret)].flow-=flow[End];
now=edge[ret].from;
}
return ans;
} int main(){
n=read(),m=read();
End=calc(n,m,)+;
for(int i=;i<=n;++i){
char ch[];
scanf("%s",ch+);
for(int j=;j<=m;++j) sta[i][j]=ch[j]-'';
}
for(int i=;i<=n;++i){
char ch[];
scanf("%s",ch+);
for(int j=;j<=m;++j) edn[i][j]=ch[j]-'';
}
for(int i=;i<=n;++i){
char ch[];
scanf("%s",ch+);
for(int j=;j<=m;++j) swa[i][j]=ch[j]-'';
}
int sum1=,sum2=;
for(int i=;i<=n;++i)
for(int j=;j<=m;++j){
if(sta[i][j]){
sum1++;
add(Start,calc(i,j,),,);
}
if(edn[i][j]){
sum2++;
add(calc(i,j,),End,,);
}
if(sta[i][j]&&(!edn[i][j])){
add(calc(i,j,),calc(i,j,),,swa[i][j]>>);
add(calc(i,j,),calc(i,j,),,(swa[i][j]+)>>);
}
if((!sta[i][j])&&edn[i][j]){
add(calc(i,j,),calc(i,j,),,(swa[i][j]+)>>);
add(calc(i,j,),calc(i,j,),,swa[i][j]>>);
}
if(sta[i][j]==edn[i][j]){
add(calc(i,j,),calc(i,j,),,swa[i][j]>>);
add(calc(i,j,),calc(i,j,),,swa[i][j]>>);
}
for(int k=;k<;++k){
int x=i+u[k];int y=j+w[k];
if(x<||x>n||y<||y>m) continue;
add(calc(i,j,),calc(x,y,),,0x7fffffff);
}
}
if(sum1!=sum2){
printf("-1");
return ;
}
int ans=;
while(){
Ans now=spfa();
if(!now.val) break;
ans+=now.val*now.dis;
}
if(sum!=sum1){
printf("-1");
return ;
}
printf("%d",ans);
return ;
}
https://www.luogu.org/problemnew/solution/P3159
【Luogu】P3159交换棋子(超出我能力范围的费用流)的更多相关文章
- 洛谷P3159 交换棋子 神奇的网络流
神奇的建模...原题链接 如果你真的把交换看成交换,就\(GG\)了.首先我们要把交换看成是白棋的移动. 然后,很容易的就想到建模的大致思路:建立超级源点S和超级汇点T,从S向初始局面每个白棋所在的格 ...
- 洛谷 P3159(BZOJ 2668)[CQOI2012]交换棋子
有一个\(n\)行\(m\)列的黑白棋盘,你每次可以交换两个相邻格子(相邻是指有公共边或公共顶点)中的棋子,最终达到目标状态.要求第\(i\)行第\(j\)列的格子只能参与\(m[i][j]\)次交换 ...
- P3159 [CQOI2012]交换棋子
思路 相当神奇的费用流拆点模型 最开始我想到把交换黑色棋子看成一个流流动的过程,流从一个节点流向另一个节点就是交换两个节点,然后把一个位置拆成两个点限制流量,然后就有了这样的建图方法 S向所有初始是黑 ...
- 【BZOJ-2668】交换棋子 最小费用最大流
2668: [cqoi2012]交换棋子 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 1055 Solved: 388[Submit][Status ...
- BZOJ2668: [cqoi2012]交换棋子
题解: 可以戳这里:http://www.cnblogs.com/zig-zag/archive/2013/04/21/3033485.html 其实自己yy一下就知道这样建图的正确性了. 感觉太神奇 ...
- BZOJ 2668: [cqoi2012]交换棋子
2668: [cqoi2012]交换棋子 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 1112 Solved: 409[Submit][Status ...
- 【BZOJ2668】[cqoi2012]交换棋子 费用流
[BZOJ2668][cqoi2012]交换棋子 Description 有一个n行m列的黑白棋盘,你每次可以交换两个相邻格子(相邻是指有公共边或公共顶点)中的棋子,最终达到目标状态.要求第i行第j列 ...
- BZOJ2668:[CQOI2012]交换棋子(费用流)
题目描述 有一个n行m列的黑白棋盘,你每次可以交换两个相邻格子(相邻是指有公共边或公共顶点)中的棋子,最终达到目标状态.要求第i行第j列的格子只能参与mi,j次交换. 输入输出格式 输入格式: 第一行 ...
- [cqoi2012]交换棋子
2668: [cqoi2012]交换棋子 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 1334 Solved: 518[Submit][Stat ...
随机推荐
- ABAP Development Tools的语法高亮实现原理
ABAP Development Tools的前端是Java,根本识别不了ABAP.那么在ADT里的ABAP语法高亮是如何实现的? 第一次打开一个report时,显示在ADT里的代码是没有任何语法高亮 ...
- GWT module 'xxx' may need to be (re)compiled解决办法
使用GWT Eclipse Plug-in开发GWT应用,启动程序,在浏览器地址栏中输入http://127.0.0.1:8888/HelloWorld.html,没有出现我所期望的结果,而是弹出如下 ...
- noip模拟赛#14
#14: T1:f[x]=x-1(x&1)||x/2(x&1=0) 求[n,m]有多少个数可以通过变换得到k.(1e9). =>好像cf上看过类似的题,用二进制的方式来写.不过我 ...
- 字符编码:WideCharToMultiByte
WideCharToMultiByte 编辑 目录 1基本介绍及功能 2相关变量 1基本介绍及功能编辑 WideCharToMultiByte 函数功能:该函数映射一个unicode字符串 ...
- apropos linux
Apropos adj. 恰当的,关于,就...而言 adv. 顺便地,恰当地 All my suggestions apropos the script were accepted. 我所有有关该剧 ...
- Vue 后台管理
这里是结合vue和element快速成型的一个demo 里面展示了基本的后台管理界面的大体结构和element的基本操作 GitHub的地址:https://github.com/wwwming/ad ...
- webgis技术在智慧城市综合治理(9+X)网格化社会管理平台(综治平台)的应用研究
综治中心9+X网格化社会管理平台 为落实中央关于加强创新社会治理的要求,适应国家治理体系和治理能力现代化要求,以基层党组织为核心,以整合资源.理顺关系.健全机制.发挥作用为目标,规范街道.社区综治中心 ...
- TCP/UDP 协议介绍
TCP/IP五层网络结构模型 物理层:物理层建立在物理通信介质的基础上,作为系统和通信介质的接口,用来实现数据链路实体间透明的比特 (bit) 流传输.只有该层为真实物理通信,其它各层为虚拟通信 数据 ...
- [bzoj]1930 pacman吃豆豆
Description 两个PACMAN吃豆豆.一开始的时候,PACMAN都在坐标原点的左下方,豆豆都在右上方.PACMAN走到豆豆处就会吃掉它.PACMAN行走的路线很奇怪,只能向右走或者向上走,他 ...
- destoon ip接口失效修改 修改后偶尔会加载很慢
因为百度ip转换增加了密匙验证,所以导致之前的接口无法再转换ip地址的信息,修复方法如下:打开include\cloud.func.php文件搜索: function iplookup($ip) { ...