hdu 1533 KM或费用流
以前用KM写过,现在再用费用流写。
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <queue>
- #include <vector>
- #include <utility>
- #define abs(a) ((a)<0?-(a):(a))
- #define maxn 210
- #define oo 0x3f3f3f3f
- using namespace std;
- struct Edge {
- int u, v, c, f;
- Edge( int u, int v, int c, int f ):u(u),v(v),c(c),f(f){}
- };
- struct Mcmf {
- int n, src, dst;
- vector<Edge> edge;
- vector<int> g[maxn];
- int dis[maxn], pth[maxn], ext[maxn];
- void init( int n, int src, int dst ) {
- this->n = n;
- this->src = src;
- this->dst = dst;
- for( int i=; i<=n; i++ )
- g[i].clear();
- edge.clear();
- }
- void add_edge( int u, int v, int c, int f ) {
- g[u].push_back( edge.size() );
- edge.push_back( Edge(u,v,c,f) );
- g[v].push_back( edge.size() );
- edge.push_back( Edge(v,u,-c,) );
- }
- bool spfa( int &flow, int &cost ) {
- queue<int> qu;
- memset( dis, 0x3f, sizeof(dis) );
- qu.push( src );
- ext[src] = true;
- dis[src] = ;
- pth[src] = -;
- while( !qu.empty() ) {
- int u=qu.front();
- qu.pop();
- ext[u] = false;
- for( int t=; t<g[u].size(); t++ ) {
- Edge &e = edge[g[u][t]];
- if( e.f && dis[e.v]>dis[e.u]+e.c ) {
- dis[e.v] = dis[e.u]+e.c;
- pth[e.v] = g[u][t];
- if( !ext[e.v] ) {
- ext[e.v] = true;
- qu.push( e.v );
- }
- }
- }
- }
- if( dis[dst]==oo ) return false;
- int flw = oo;
- for( int eid=pth[dst]; eid!=-; eid=pth[edge[eid].u] )
- flw = min( flw, edge[eid].f );
- for( int eid=pth[dst]; eid!=-; eid=pth[edge[eid].u] ) {
- edge[eid].f -= flw;
- edge[eid^].f += flw;
- }
- flow += flw;
- cost += flw*dis[dst];
- return true;
- }
- void mcmf( int &flow, int &cost ) {
- flow = cost = ;
- while( spfa(flow,cost) );
- }
- };
- int n, m;
- int aa[maxn][], bb[maxn][], ta, tb;
- Mcmf M;
- int main() {
- ios::sync_with_stdio( false );
- while() {
- cin>>n>>m;
- if( n== && m== ) return ;
- ta = tb = ;
- for( int i=; i<=n; i++ )
- for( int j=; j<=m; j++ ) {
- char ch;
- cin>>ch;
- if( ch=='m' ) {
- ta++;
- aa[ta][] = i;
- aa[ta][] = j;
- } else if( ch=='H' ) {
- tb++;
- bb[tb][] = i;
- bb[tb][] = j;
- }
- }
- M.init( ta+tb+, ta+tb+, ta+tb+ );
- for( int i=; i<=ta; i++ )
- M.add_edge( M.src, i, , );
- for( int j=ta+; j<=ta+tb; j++ )
- M.add_edge( j, M.dst, , );
- for( int i=; i<=ta; i++ )
- for( int j=ta+; j<=ta+tb; j++ ) {
- int dis = abs(aa[i][]-bb[j-ta][])+abs(aa[i][]-bb[j-ta][]);
- M.add_edge( i, j, dis, );
- }
- int flow, cost;
- M.mcmf( flow, cost );
- cout<<cost<<endl;
- }
- }
hdu 1533 KM或费用流的更多相关文章
- HDU 3488--Tour(KM or 费用流)
因为每个点只能经过一次 所以考虑拆点 这题有坑,有重边.. KM算法 把一个点拆成入点和出点 入点在X部,出点在Y步. 如果u,v之间有路径,就在X部的u点连接Y部的v点 求完美匹配. 当完美匹配的时 ...
- POJ 2195 Going Home / HDU 1533(最小费用最大流模板)
题目大意: 有一个最大是100 * 100 的网格图,上面有 s 个 房子和人,人每移动一个格子花费1的代价,求最小代价让所有的人都进入一个房子.每个房子只能进入一个人. 算法讨论: 注意是KM 和 ...
- HDU 5988 Coding Contest(费用流+浮点数)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5988 题目大意: 给定n个点,m条有向边,每个点是一个吃饭的地方,每个人一盒饭.每个点有S个人,有B盒 ...
- POJ 2135 Farm Tour && HDU 2686 Matrix && HDU 3376 Matrix Again 费用流求来回最短路
累了就要写题解,近期总是被虐到没脾气. 来回最短路问题貌似也能够用DP来搞.只是拿费用流还是非常方便的. 能够转化成求满流为2 的最小花费.一般做法为拆点,对于 i 拆为2*i 和 2*i+1.然后连 ...
- Going Home HDU - 1533(最大费用最小流)
On a grid map there are n little men and n houses. In each unit time, every little man can move one ...
- HDU 1533 KM算法(权值最小的最佳匹配)
Going Home Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- HDU 3315 My Brute(费用流)
职务地址:HDU 3315 这个题的思路全然是自己想出来的,自我感觉挺巧妙的. . .(大牛勿喷.. . )对大胆建图又多了一份信心. 详细思路是构造一个二分图,Si连源点.Xi连汇点,流量都是1,费 ...
- HDU 2686 Matrix(最大费用流)
Matrix Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- HDU 1533 & KM模板
题意 求二分图最小完备匹配. SOL 建个图那么方便的事情是吧...然后边权都是正的(好像根边权也没什么关系),既然要求最小那么把边权取个相反数跑个KM就好了.. CODE: /*========== ...
随机推荐
- NB二人组(一)----堆排序
堆排序前传--树与二叉树简介 特殊且常用的树--二叉树 两种特殊的二叉树 二叉树的存储方式 二叉树小结 堆排序 堆这个玩意....... 堆排序过程: 构造堆: 堆排序的算法程序(程序需配合着下图理 ...
- 巅峰极客CTF writeup[上]
经验教训 1.CTF不比实战,最好不要死磕.死磕就输了.我就是死磕在缓存文件死的.真的惭愧: 2.对于flag的位置不要太局限于web目录下,如果是命令执行直接上find / -name flag*: ...
- 64_t5
texlive-mkpattern-svn15878.1.2-33.fc26.2.noarch..> 24-May-2017 15:54 38178 texlive-mkpic-bin-svn3 ...
- MySQL删除数据几种情况以及是否释放磁盘空间【转】
MySQL删除数据几种情况以及是否释放磁盘空间: 1.drop table table_name 立刻释放磁盘空间 ,不管是 Innodb和MyISAM ; 2.truncate table tabl ...
- openstack环境下的虚拟机通过浮动IP访问后能ping通外网IP不能ping通域名
1.环境简介 openstack环境下构造Ubuntu系统的VM,VM配置受管子网和自管子网,同时绑定浮动IP 2.通过浮动IP访问VM后,ping www.baidu.com失败,但是通过IP地址p ...
- JNDI(Java Naming and Directory Interface,Java命名和目录接口)
JNDI(Java Naming and Directory Interface,Java命名和目录接口)是SUN公司提供的一种标准的Java命名系统接口,JNDI提供统一的客户端API,通过不同的访 ...
- 根据名字杀死进程Killall
Killall命令可以用来给一个特定的进程发送一个信号.这个信号默认情况下是SIGTERM,但也可以由killall命令使用参数来指定其它信号.现在让我们通过一些实际的例子来看看这个命令的实际用法. ...
- plsql例子
create or replace procedure find_difference(db_link in varchar2) is /* 比对两套环境建表脚本差异,以224环境为主 当前环境,db ...
- HDU 4725 The Shortest Path in Nya Graph(spfa+虚拟点建图)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4725 题目大意:有n层,n个点分布在这些层上,相邻层的点是可以联通的且距离为c,还有额外给出了m个条边 ...
- mongodb与mysql传统的关系数据库区别
转自:易百教程 MongoDB中的数据具有灵活的模式.文档在同一集合,但它们不需要具有相同的字段或结构集合,集合文档中的公共字段可以包含不同类型的数据. MongoDB中的数据具有灵活的模式.与SQL ...