Link:

BZOJ 2668 传送门

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] 交换棋子的更多相关文章

  1. BZOJ 2668 交换棋子(费用流)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2668 题意:有一个n行m列的黑白棋盘,你每次可以交换两个相邻格子中的棋子,最终达到目标状 ...

  2. 【BZOJ】【2668】【CQOI2012】交换棋子

    网络流/费用流 跪跪跪,居然还可以这样建图…… 题解:http://www.cnblogs.com/zig-zag/archive/2013/04/21/3033485.html 考虑每个点的交换限制 ...

  3. BZOJ 2668 [cqoi2012]交换棋子 | 最小费用最大流

    传送门 BZOJ 2668 题解 同时分别限制流入和流出次数,所以把一个点拆成三个:入点in(x).中间点mi(x).出点ou(x). 如果一个格子x在初始状态是黑点,则连(S, mi(x), 1, ...

  4. BZOJ 2668: [cqoi2012]交换棋子

    2668: [cqoi2012]交换棋子 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 1112  Solved: 409[Submit][Status ...

  5. 【BZOJ-2668】交换棋子 最小费用最大流

    2668: [cqoi2012]交换棋子 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 1055  Solved: 388[Submit][Status ...

  6. BZOJ2668: [cqoi2012]交换棋子

    题解: 可以戳这里:http://www.cnblogs.com/zig-zag/archive/2013/04/21/3033485.html 其实自己yy一下就知道这样建图的正确性了. 感觉太神奇 ...

  7. [cqoi2012]交换棋子

      2668: [cqoi2012]交换棋子 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 1334  Solved: 518[Submit][Stat ...

  8. 【BZOJ2668】[cqoi2012]交换棋子 费用流

    [BZOJ2668][cqoi2012]交换棋子 Description 有一个n行m列的黑白棋盘,你每次可以交换两个相邻格子(相邻是指有公共边或公共顶点)中的棋子,最终达到目标状态.要求第i行第j列 ...

  9. [BZOJ 4563]放棋子

    [BZOJ 4563]放棋子 题目 给你一个N*N的矩阵,每行有一个障碍,数据保证任意两个障碍不在同一行,任意两个障碍不在同一列,要求你在这个矩阵上放N枚棋子(障碍的位置不能放棋子),要求你放N个棋子 ...

随机推荐

  1. Jquery checkbox 遍历

    checkbox 全选\全部取消 $("#ChkAll").click(function(){    $("#divContent input[type='checkbo ...

  2. 虚拟机出现intel vt -x 处于禁用状态打不开处理方式

    处理方式 . 1 进入bios 以华硕主板为例 进入高级模式找到cpu虚拟技术 打开虚拟技术支持 其它电脑找到这个

  3. MVC自定义路由实现URL重写,SEO优化

    //App_Start-RouteConfig.cs public class RouteConfig { public static void RegisterRoutes(RouteCollect ...

  4. sicily 1063. Who's the Boss

    Time Limit: 1sec    Memory Limit:32MB  Description Several surveys indicate that the taller you are, ...

  5. C11 标准特性研究

    前言 - 需要点开头 C11标准是C语言标准的第三版(2011年由ISO/IEC发布),前一个标准版本是C99标准. 相比C99,C11有哪些变化呢!!所有的测试全部基于能够和标准贴合的特性平台. 但 ...

  6. nginx配置文件的详细讲解

    user nginx nginx; #定义Nginx运行的用户和用户组worker_processes 1; #nginx进程数,建议设置为等于CPU总核心数worker_rlimit_nofile ...

  7. [ python ] 项目一:FTP程序

    声明: 该项目参考学习地址: http://www.cnblogs.com/lianzhilei/p/5869205.html , 感谢博主分享,如有侵权,立即删除. 作业:开发一个支持多用户在线的F ...

  8. HIbernate学习笔记3 之 缓存和 对象的三种状态

    一.hibernate一级缓存 *  hibernate创建每个Session对象时,都会给该Session分配一块独立的缓冲区,用于存放Session查询出来的对象,这个分配给session的缓存区 ...

  9. awk处理之案例五:awk匹配字段2包含字段1的文本

    编译环境 本系列文章所提供的算法均在以下环境下编译通过. [脚本编译环境]Federa 8,linux 2.6.35.6-45.fc14.i686 [处理器] Intel(R) Core(TM)2 Q ...

  10. 字符串截取,SubString

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAk8AAACYCAIAAAByAZqHAAAYgklEQVR4nO2dL28ku5qHTS4ctuTSQf ...