题目链接: http://codeforces.com/gym/257279/problem/C

题意:

你有一个 n∗mn*mn∗m 的矩阵,这些方格中有数字 1−n∗m/21-n*m/21−n∗m/2 每个数字出现两次,现在要你选出最少的方格个数,使得在这些方格内数字可以任意交换的情况下,可以实现两个相同的数字邻接。

做法:

感觉就是用图论做,就是网络流建不出图来…和队友综合一下应该就能过了…

大概就是,假设我们已经知道了最后的排列分布,它一定是某个含横竖长度为 222 的线段图,在这个图中,如果和原来的排列不同的会产生贡献。

因为 n∗mn*mn∗m 一定为偶数,我们从原点向所有的 i+ji+ji+j 奇数连边,偶数向汇点连边,每个奇数点只向四周的偶数点连边,就可以保证可以得到像上面那样结果的构图。

代码

#include <bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
typedef long long ll;
const int maxn=7000;
const int maxm=100005;
const int inf=0x3f3f3f3f;
int dis[maxn],mp[85][85];
int vis[maxn],pre[maxn];
int head[maxn],cnt;
int n,m,sp,tp;
ll ans=0;
struct node{int to,cap,cost,next;
}e[maxm];
void add(int from,int to,int cap,int cost){e[cnt].to=to; e[cnt].cap=cap;e[cnt].cost=cost; e[cnt].next=head[from];head[from]=cnt++;e[cnt].to=from; e[cnt].cap=0;e[cnt].cost=-cost; e[cnt].next=head[to];head[to]=cnt++;
}
bool spfa(int s,int t,int &flow,int &cost){queue<int> q;memset(dis,inf,sizeof(dis));memset(vis,0,sizeof(vis));memset(pre,-1,sizeof(pre));dis[s]=0;  q.push(s);vis[s]=1;int d=inf;while(!q.empty()){int u=q.front();q.pop();vis[u]=0;for(int i=head[u];~i;i=e[i].next){int v=e[i].to;if(e[i].cap>0&&dis[v]>dis[u]+e[i].cost){dis[v]=dis[u]+e[i].cost;pre[v]=i;if(!vis[v]){vis[v]=1;q.push(v);}}}}if(dis[t]==inf){return false;}for(int i=pre[t];~i;i=pre[e[i^1].to]){d=min(d,e[i].cap);}for(int i=pre[t];~i;i=pre[e[i^1].to]){e[i].cap-=d;e[i^1].cap+=d;cost+=e[i].cost*d;}flow+=d;return true;
}
int mcmf(int s,int t){int flow=0,cost=0;while(spfa(s,t,flow,cost)){//cout<<flow<<" "<<cost<<endl;}return cost;
}
int G(int x,int y){return (x-1)*m+y;
}
int Same(int xl,int yl,int xr,int yr){return mp[xl][yl]!=mp[xr][yr];
}
int main(){memset(head,-1,sizeof(head));ans=0;scanf("%d%d",&n,&m);sp=0;tp=m*n+1;rep(i,1,n) rep(j,1,m) scanf("%d",&mp[i][j]);rep(i,1,n){rep(j,1,m){if((i+j)&1){add(sp,G(i,j),1,0);if(i>1) add(G(i,j),G(i-1,j),1,Same(i,j,i-1,j));if(j>1) add(G(i,j),G(i,j-1),1,Same(i,j,i,j-1));if(j<m) add(G(i,j),G(i,j+1),1,Same(i,j,i,j+1));if(i<n) add(G(i,j),G(i+1,j),1,Same(i,j,i+1,j));}else add(G(i,j),tp,1,0);}}cout<<mcmf(sp,tp)<<endl;return 0;
}

316C Tidying Up 费用流的完美匹配相关推荐

  1. UVA1411 Ants(带权二分图的最大完美匹配、zkw费用流)

    题解 给定一些黑点白点,要求一个黑点链接一个白点并且线段不相交(转成二分图最大权匹配使用费用流解决)<训练指南>P351 输出方案:满流即为答案(满流是指这条路的流量跑满了,也就是说edg ...

  2. hdu 3395(费用流,二分图的最大权匹配)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3395 解题思路: 这个构图很容易出错,最开始都容易想,把每个点拆开,分为攻击和被攻击的,建图如下: 源 ...

  3. [NOI2012]美食节——费用流(带权二分图匹配)+动态加边

    题目描述 小M发现,美食节共有n种不同的菜品.每次点餐,每个同学可以选择其中的一个菜品.总共有m个厨师来制作这些菜品.当所有的同学点餐结束后,菜品的制作任务就会分配给每个厨师.然后每个厨师就会同时开始 ...

  4. upc 6445: 棋盘V (网络流费用流解决匹配问题)

    6445: 棋盘V 时间限制: 1 Sec  内存限制: 128 MB 提交: 325  解决: 31 [提交] [状态] [讨论版] [命题人:admin] 题目描述 有一块棋盘,棋盘的边长为100 ...

  5. C2. Tidying Up(费用流 二分图)

    http://codeforces.com/problemset/problem/316/C2 题意: 有n*m格子,[1,n*m/2]每个数都出现两次,现在可以选择一些点,被选择的点之间可以任意交换 ...

  6. 【SPOJ - SCITIES】Selfish Cities (二分图最优匹配,最大费用流)

    题干: Far, far away there is a world known as Selfishland because of the nature of its inhabitants. Ha ...

  7. 洛谷 - P4015 运输问题(费用流)

    题目链接:点击查看 题目大意:有n个卖家和m个买家,每个卖家会卖ai个物品,每个买家会买bi个物品,每个卖家向每个卖家卖东西会有一定的代价,问如何匹配才能让代价最小/最大 题目分析:和上一道题大同小异 ...

  8. UVA 1349 Optimal Bus Route Design (二分图最小权完美匹配)

    恰好属于一个圈,那等价与每个点有唯一的前驱和后继,这让人想到了二分图, 把一个点拆开,点的前驱作为S集和点的后继作为T集,然后连边,跑二分图最小权完美匹配. 写的费用流..最大权完美匹配KM算法没看懂 ...

  9. BZOJ1150[CTSC2007]数据备份Backup——模拟费用流+堆+链表

    题目描述 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游 ...

最新文章

  1. SSM+BJUI实现添加和编辑共用一个页面
  2. poj 1011 Sticks 搜索
  3. innodb_locks_unsafe_for_binlog分析
  4. php use闭包参数,php 闭包use的使用
  5. windows2012同步linux时间,Windows server2012时间同步NTP配置
  6. [js高手之路] 跟GhostWu一起封装一个字符串工具库-扩展字符串位置方法(4)
  7. MSSMS18闪退解决方法
  8. 军哥lnmp一键安装包详解
  9. ARM裸机开发(三)SDRAM编程
  10. 【MTSP】基于matlab遗传算法求解多旅行商问题【含Matlab源码 016期】
  11. asp.net core 读取json文件
  12. mysql物流管理系统_物流配送中心管理系统(SSM+MYSQL)
  13. 一三五、服务器部署Node项目、Vue spa静态项目、ssr项目
  14. python实现MD5加密工具
  15. ​深圳国际会展中心希尔顿、茂名浪漫海岸喜来登度假、南昌青山湖希尔顿欢朋酒店开业 | 中国酒店周刊...
  16. red5 FAQ - 刚接触red5的可以看看
  17. python2和python3的区别
  18. Graylog日志简介
  19. [Share] How To Ask Questions The Smart Way
  20. [Chrome] 超级好用的网页保存插件

热门文章

  1. Day01 数据爬取并可视化数据
  2. Python 高级:05 HTTP 协议和静态 Web 服务器
  3. 跟我一起学RT-Thread之ARM架构初探
  4. 上海是个怎样的城市?
  5. react-native 接QQ钱包支付的SDK
  6. 中小型商城系统中的分类/产品属性/扩展属性的数据库设计
  7. 物联12:rfid低频和高频天线技术
  8. 企业图纸发放管理系统-图纸管理系统
  9. oracle排序desc和,Oracle数据库排序ORDER BY子句的使用总结篇
  10. 真无线蓝牙耳机推荐哪个好?学生党蓝牙耳机推荐