费用流模板(带权二分图匹配)——hdu1533
- /*
- 带权二分图匹配
- 用费用流求,增加源点s 和 汇点t
- */
- #include<bits/stdc++.h>
- using namespace std;
- #define maxn 10005
- #define maxm 200005
- struct Edge{int to,nxt,w,c;}e[maxm<<];
- int head[maxn],tot,n,m,s,t,ans,maxflow;
- char mp[maxn][maxn];
- vector<pair<int,int> >M,H;
- void add(int u,int v,int w,int c){
- e[tot].to=v;e[tot].w=w;e[tot].c=c;e[tot].nxt=head[u];head[u]=tot++;
- e[tot].to=u;e[tot].w=;e[tot].c=-c;e[tot].nxt=head[v];head[v]=tot++;
- }
- int d[maxn],v[maxn],incf[maxn],pre[maxn];
- bool spfa(){
- queue<int>q;
- memset(d,0x3f,sizeof d);
- memset(v,,sizeof v);
- q.push(s);d[s]=;v[s]=;
- incf[s]=<<;
- while(q.size()){
- int x=q.front();q.pop();v[x]=;
- for(int i=head[x];i!=-;i=e[i].nxt){
- int y=e[i].to;
- if(e[i].w==)continue;
- if(d[y]>d[x]+e[i].c){
- d[y]=d[x]+e[i].c;
- incf[y]=min(incf[x],e[i].w);
- pre[y]=i;
- if(!v[y])v[y]=,q.push(y);
- }
- }
- }
- if(d[t]==0x3f3f3f3f)return false;
- return true;
- }
- void update(){
- int x=t;
- while(x!=s){
- int i=pre[x];
- e[i].w-=incf[t];
- e[i^].w+=incf[t];
- x=e[i^].to;
- }
- maxflow+=incf[t];
- ans+=d[t]*incf[t];
- }
- void init(){
- memset(head,-,sizeof head);
- tot=ans=maxflow=;
- M.clear();H.clear();
- }
- int dis(pair<int,int> a,pair<int,int> b){
- return abs(a.first-b.first)+abs(a.second-b.second);
- }
- int main(){
- while(cin>>n>>m&&n){
- init();
- for(int i=;i<=n;i++)
- for(int j=;j<=m;j++){
- scanf("\n%c",&mp[i][j]);
- if(mp[i][j]=='m')
- M.push_back(make_pair(i,j));
- if(mp[i][j]=='H')
- H.push_back(make_pair(i,j));
- }
- s=,t=*M.size()+;
- for(int i=;i<M.size();i++)
- add(s,i+,,);
- for(int i=;i<H.size();i++)
- add(i++M.size(),t,,);
- for(int i=;i<M.size();i++)
- for(int j=;j<H.size();j++)
- add(i+,j++M.size(),,dis(M[i],H[j]));
- while(spfa())
- update();
- cout<<ans<<'\n';
- }
- }
费用流模板(带权二分图匹配)——hdu1533的更多相关文章
- [NOI2012]美食节——费用流(带权二分图匹配)+动态加边
题目描述 小M发现,美食节共有n种不同的菜品.每次点餐,每个同学可以选择其中的一个菜品.总共有m个厨师来制作这些菜品.当所有的同学点餐结束后,菜品的制作任务就会分配给每个厨师.然后每个厨师就会同时开始 ...
- 运动员最佳匹配问题 KM算法:带权二分图匹配
题面: 羽毛球队有男女运动员各n人.给定2 个n×n矩阵P和Q.P[i][j]是男运动员i和女运动员j配对组成混合双打的男运动员竞赛优势:Q[i][j]是女运动员i和男运动员j配合的女运动员竞赛优势. ...
- POJ 2195 Going Home (带权二分图匹配)
POJ 2195 Going Home (带权二分图匹配) Description On a grid map there are n little men and n houses. In each ...
- POJ 2195 Going Home | 带权二分图匹配
给个地图有人和房子 保证人==房子,每个人移动到房子处需要花费曼哈顿距离的代价 问让人都住在房子里最小代价 显然是个带权二分图最大匹配 转化成以一个网络,规定w是容量,c是代价 1.S向人连边,w=1 ...
- hdu5045:带权二分图匹配
题目大意 : n个人 做m道题,其中 每连续的n道必须由不同的人做 已知第i人做出第j题的概率为pij,求最大期望 思路:考虑每连续的n道题 都要n个人来做,显然想到了带权的二分图匹配 然后就是套模板 ...
- Glorious Brilliance (最短路 + 带权二分图匹配)
这是一道代码大题.一开始读错题意了,然后理解成直接看上去的那种相邻,然后想不通好久!!! 把不同联通的图分离出来,然后先预处理一下形成之后的相邻图的状态,然后根据01确定哪一些是需要更换状态的,然后建 ...
- [HAOI2008]移动玩具(状压&带权二分图)
题目描述 • 一个 4 × 4 的 0/1 矩阵 • 每次可以交换相邻两个元素 • 求从初始状态到目标状态的最小交换次数 输入格式 前四行,每行一个长为 4 的 0/1 字符串,描述初始状态. 后四行 ...
- KM(Kuhn-Munkres)算法求带权二分图的最佳匹配
KM(Kuhn-Munkres)算法求带权二分图的最佳匹配 相关概念 这个算法个人觉得一开始时有点难以理解它的一些概念,特别是新定义出来的,因为不知道是干嘛用的.但是,在了解了算法的执行过程和原理后, ...
- Luogu 1559 运动员最佳匹配问题(带权二分图最大匹配)
Luogu 1559 运动员最佳匹配问题(带权二分图最大匹配) Description 羽毛球队有男女运动员各n人.给定2 个n×n矩阵P和Q.P[i][j]是男运动员i和女运动员j配对组成混合双打的 ...
随机推荐
- boost asio acceptor 构造
boost::asio::io_service io_svc; boost::asio::ip::address_v4 lis_ip; // 默认监听本机所有IP boost::asio::ip::t ...
- mfc中的_T
mfc 中的字符串表示常用_T,意为text,定义为宏定义,可以方便的定义所有字符串为UNICODE(16位,长字符)或者ANSI(8位,短字符). 如果对于所有的字符串定义了_T并且定义了预处理标志 ...
- Replication Controller、Replica Set
假如我们现在有一个Pod正在提供线上的服务,我们来想想一下我们可能会遇到的一些场景: 某次运营活动非常成功,网站访问量突然暴增 运行当前Pod的节点发生故障了,Pod不能正常提供服务了 第一种情况,可 ...
- shell脚本中:单引号和双引号的区别
单引号和双引号的区别 前面我们还留下一个疑问,定义变量时,变量的值可以由单引号' '包围,也可以由双引号" "包围,它们到底有什么区别呢?不妨以下面的代码为例来说明: #!/bin ...
- SCOI 2014 省选总结
总的来说作为高一党,去做省选难度的题完全就是去玩的,还是找惯例起身跪hja. 跪毕,看看自己惨不忍睹的成绩,我只想说:电子坑大为什么day1的暴力只有10分!为什么呢?我笑看题面: 方伯伯种玉米,方伯 ...
- JavaScript中深拷贝实现
JavaScript 中深拷贝实现 拷贝时候涉及到: 1.循环结构 2.判断数组 Array 还是对象 Object 函数实现 /** * 获取满足条件的数组中的第一个元素 * @param ...
- Java中JNI的使用详解第六篇:C/C++中的引用类型和Id的缓存
首先来看一下C/C++中的引用 从Java虚拟机创建的对象传到本地C/C++代码时会产生引用,根据Java的垃圾回收机制,只要有引用存在就不会触发该引用指向的Java对象的垃圾回收 第一.局部引用: ...
- 树形dp换根,求切断任意边形成的两个子树的直径——hdu6686
换根dp就是先任取一点为根,预处理出一些信息,然后在第二次dfs过程中进行状态的转移处理 本题难点在于任意割断一条边,求出剩下两棵子树的直径: 设割断的边为(u,v),设down[v]为以v为根的子树 ...
- NX二次开发-UFUN获取工程图详细信息UF_DRAW_ask_drawing_info
NX9+VS2012 #include <uf.h> #include <uf_draw.h> #include <uf_part.h> UF_initialize ...
- Cstring转char、string、int等数据类型的方法(转载)
Cstring转char.string.int等数据类型的方法 (-- ::) 转载 标签: 杂谈 分类: VC CString 转char * CString cstr; char *p = (LP ...