题目链接: 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. C# richtextbox 自动下拉到最后 方法 RichTextBox读取txt中文后出现乱码
  2. 微服务架构实战项目Serverless的持续交付与架构案例
  3. ASP读取ACCESS数据库随机记录的方法
  4. jpa报错No property found for column ‘first_time‘ mapped to field ‘first_time‘
  5. 计算机网络中的时延有哪几部分,计算机网络中的四种延迟分别是什么?
  6. 洛谷P1246C语言,codevs1246 丑数
  7. P2634 [国家集训队]聪聪可可(树形dp)
  8. Redis数据持久化、数据备份、数据的故障恢复
  9. c++ map初始化_Go学习每日一问(18)-map元素查找
  10. gperftools安装使用_记一次使用gperftools优化线上程序
  11. mysql5.6解压版 1067_MySQL5.6解压版服务无法启动—系统错误1067
  12. 查看C语言库函数源码
  13. 华为密盒M310最新固件-精简美化版
  14. webapp(WebRoot)目录下的jsp访问不了webapp目录的css文件的问题解决
  15. Windows11 0x80190001错误解决
  16. c语言电子时钟课程设计报告,电子时钟嵌入式课程设计报告
  17. 练习:试炼自然常数e
  18. python中与six有关的whl_pandas - 在升级numpy,six和python-dateutil时,无法使用pip来安装pandas - 堆栈内存溢出...
  19. 同时采集抖音里多个视频,并批量添加相同的背景图片
  20. win10用户权限设置计算机管理权限,win10系统怎么取得完美管理员权限

热门文章

  1. Python要如何实现列表排序的几种方法
  2. 電腦android备份软件,可以使用什么软件备份Android手机系统,类似于将当前系统备份到计算机上的GHO?...
  3. Mac 使用 Valet 部署 PHP 项目
  4. 【Python】收集雨水问题:给定n个非负整数,表示直方图的方柱的高度,同时,每个方柱的宽度假定都为1。若使用这样形状的容器收集雨水,可以盛多少水量?
  5. 一.微软office制作PPT时需要优化的一些设置
  6. 微信电商小程序购买/加入购物车组件设计
  7. android 画空心矩形框,Android实现空心圆角矩形按钮的实例代码
  8. 设计图纸管理系统的特点介绍
  9. 生态合作 花开羊城——2018中国软件生态大会·广州站
  10. Python脚本工具,PyMuPDF批量提取PDF文件中的图片