[BZOJ 2668] 交换棋子
Link:
Solution:
重点在于对于每条转移路径:首尾算一次,中间节点算两次
可以一点拆三点,将原流量拆成入流量和出流量
但其实也可以就拆两点,分前后是否是一首尾点一普通点来确定是否有一条路径只占用1流量
Code:
#include <bits/stdc++.h> using namespace std;
#define X first
#define Y second
typedef long long ll;
typedef pair<int,int> P;
const int MAXN=1e5+,INF=<<;
int n,m,cnt1,cnt2;char dat[][][],lmt[][]; namespace mcmf
{
struct edge
{int to,cap,cost,rev;};
vector<edge> a[MAXN];
int S,T,h[MAXN],dist[MAXN],preV[MAXN],preE[MAXN],maxf,minc; void add_edge(int from,int to,int cap,int cost)
{
a[from].push_back(edge{to,cap,cost,a[to].size()});
a[to].push_back(edge{from,,-cost,a[from].size()-});
}
void min_cost_flow(int f)
{
while(f>)
{
priority_queue<P,vector<P>,greater<P> > que;
fill(dist,dist+T+,INF);
dist[S]=;que.push(P(,S));
while(!que.empty())
{
P t=que.top();que.pop();
int v=t.Y;if(dist[v]<t.X) continue; for(int i=;i<a[v].size();i++)
{
edge &e=a[v][i];
if(e.cap>&&dist[e.to]>dist[v]+e.cost+h[v]-h[e.to])
dist[e.to]=dist[v]+e.cost+h[v]-h[e.to],
preV[e.to]=v,preE[e.to]=i,que.push(P(dist[e.to],e.to));
}
}
if(dist[T]==INF) break;
for(int i=;i<=T;i++) h[i]+=dist[i]; int d=f;
for(int i=T;i!=S;i=preV[i])
d=min(d,a[preV[i]][preE[i]].cap);
f-=d;minc+=d*h[T];maxf+=d;
for(int i=T;i!=S;i=preV[i])
{
edge &e=a[preV[i]][preE[i]];
e.cap-=d,a[i][e.rev].cap+=d;
}
}
}
}
using namespace mcmf;
int dx[]={,,,-,-,-,,};
int dy[]={,-,,,-,,,-};
int idx(int x,int y,int z){return (x-)*m+y+n*m*z;} int main()
{
scanf("%d%d",&n,&m);
S=;T=*n*m+;
for(int i=;i<=n;i++) scanf("%s",dat[][i]+);
for(int i=;i<=n;i++) scanf("%s",dat[][i]+);
for(int i=;i<=n;i++) scanf("%s",lmt[i]+);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
if(dat[][i][j]=='')
cnt1++,add_edge(S,idx(i,j,),,);
if(dat[][i][j]=='')
cnt2++,add_edge(idx(i,j,),T,,);
if(dat[][i][j]==dat[][i][j])
add_edge(idx(i,j,),idx(i,j,),(lmt[i][j]-'')/+dat[][i][j]-'',);
else add_edge(idx(i,j,),idx(i,j,),(lmt[i][j]-''+)/,); for(int k=;k<;k++)
{
int fx=i+dx[k],fy=j+dy[k];
if(fx<||fx>n||fy<||fy>m) continue;
add_edge(idx(i,j,),idx(fx,fy,),INF,);
}
} min_cost_flow(INF);
if(cnt1!=cnt2||maxf!=cnt1) puts("-1");
else printf("%d",minc);
return ;
}
[BZOJ 2668] 交换棋子的更多相关文章
- BZOJ 2668 交换棋子(费用流)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2668 题意:有一个n行m列的黑白棋盘,你每次可以交换两个相邻格子中的棋子,最终达到目标状 ...
- 【BZOJ】【2668】【CQOI2012】交换棋子
网络流/费用流 跪跪跪,居然还可以这样建图…… 题解:http://www.cnblogs.com/zig-zag/archive/2013/04/21/3033485.html 考虑每个点的交换限制 ...
- BZOJ 2668 [cqoi2012]交换棋子 | 最小费用最大流
传送门 BZOJ 2668 题解 同时分别限制流入和流出次数,所以把一个点拆成三个:入点in(x).中间点mi(x).出点ou(x). 如果一个格子x在初始状态是黑点,则连(S, mi(x), 1, ...
- BZOJ 2668: [cqoi2012]交换棋子
2668: [cqoi2012]交换棋子 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 1112 Solved: 409[Submit][Status ...
- 【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一下就知道这样建图的正确性了. 感觉太神奇 ...
- [cqoi2012]交换棋子
2668: [cqoi2012]交换棋子 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 1334 Solved: 518[Submit][Stat ...
- 【BZOJ2668】[cqoi2012]交换棋子 费用流
[BZOJ2668][cqoi2012]交换棋子 Description 有一个n行m列的黑白棋盘,你每次可以交换两个相邻格子(相邻是指有公共边或公共顶点)中的棋子,最终达到目标状态.要求第i行第j列 ...
- [BZOJ 4563]放棋子
[BZOJ 4563]放棋子 题目 给你一个N*N的矩阵,每行有一个障碍,数据保证任意两个障碍不在同一行,任意两个障碍不在同一列,要求你在这个矩阵上放N枚棋子(障碍的位置不能放棋子),要求你放N个棋子 ...
随机推荐
- LTC 钱包部署
基础环境 系统: CentOS 7.x nodejs: v4.6.0 zeromq: 4.x 安装nodejs + zeromq 基础依赖 yum install -y gcc make gcc-c+ ...
- 关于cocos2d-x 中 CCEditBox 的输入位置和IOS虚拟键盘位置不重合的bug
这个文章的名字起的实在是有点长,主要是怕说不清楚. 在IOS上,输入时,我看到过的比较少,就两种,如附件两张图.一个是虚拟键盘的输入框完全是在CCEditBox上,另一张虚拟键盘的输入区域是紧挨着键盘 ...
- SpringBoot Mybatis 读写分离配置(山东数漫江湖)
为什么需要读写分离 当项目越来越大和并发越来大的情况下,单个数据库服务器的压力肯定也是越来越大,最终演变成数据库成为性能的瓶颈,而且当数据越来越多时,查询也更加耗费时间,当然数据库数据过大时,可以采用 ...
- js_判断当前url是否合法http(s)
alert(checkURL('http:555')); //false function checkURL(URL) { var str = URL, Expression = /http(s)?: ...
- 分布式实时日志分析解决方案ELK部署架构
一.概述 ELK 已经成为目前最流行的集中式日志解决方案,它主要是由Beats.Logstash.Elasticsearch.Kibana等组件组成,来共同完成实时日志的收集,存储,展示等一站式的解决 ...
- Linux System.map文件【转】
转自:http://blog.csdn.net/ysbj123/article/details/51233618 当运行GNU链接器gld(ld)时若使用了"-M"选项,或者使用n ...
- sicily 1012. Stacking Cylinders & 1206. Stacking Cylinders
Time Limit: 1sec Memory Limit:32MB Description Cylinders (e.g. oil drums) (of radius 1 foot) are ...
- BZOJ 2460: [BeiJing2011]元素 贪心,线性基
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2460 解法:从大到小排序,依次贪心的添加到当前集合就可以了,需要动态维护线性基.用拟阵证明 ...
- 无缝滚动Js
<html> <body> <div style="width: 190px; height: 127px; overflow: hidden; font-si ...
- Rsync文件同步服务
Rsync简介 Rsync是一款开源的.快速的.多功能的.可实现全量及增量的本地或远程数据同步备份的优秀工具,适用于Unix/Linux/Windows等多种操作系统. Rsync的特性 支持拷贝特殊 ...