题意:二分图最小权匹配。

构图:S向左边的点连容量1,费用0的边,右边的点向T连容量1,费用0的边,点之间连容量1,费用为边权的边。最小费用最大流。

注意:

1.100*100的方格中有10000个点,数组要开大;

2.n==0 && m==0 时结束。

View Code

View Code
/*Source Code
Problem: 2195  User: HEU_daoguang
Memory: 1172K  Time: 94MS
Language: G++  Result: Accepted
Source Code
*/
#include <iostream>
#include <stdio.h>
#include <queue>
#include <math.h>
#include <string.h>
using namespace std;
#define V 6005
#define E 10010000
#define inf 999999999
int n,m;
char map[102][102];
int hp[V][2],mp[V][2];int vis[V];
int dist[V];
int pre[V];struct Edge{int u,v,c,cost,next;
}edge[E];
int head[V],cnt;
void init(){cnt=0;memset(head,-1,sizeof(head));
}void addedge(int u,int v,int c,int cost){edge[cnt].u=u;edge[cnt].v=v;edge[cnt].cost=cost;edge[cnt].c=c;edge[cnt].next=head[u];head[u]=cnt++;edge[cnt].u=v;edge[cnt].v=u;edge[cnt].cost=-cost;edge[cnt].c=0;edge[cnt].next=head[v];head[v]=cnt++;
}bool spfa(int begin,int end){int u,v;queue<int> q;for(int i=0;i<=end+2;i++){pre[i]=-1;vis[i]=0;dist[i]=inf;}vis[begin]=1;dist[begin]=0;q.push(begin);while(!q.empty()){u=q.front();q.pop();vis[u]=0;for(int i=head[u];i!=-1;i=edge[i].next){if(edge[i].c>0){v=edge[i].v;if(dist[v]>dist[u]+edge[i].cost){dist[v]=dist[u]+edge[i].cost;pre[v]=i;if(!vis[v]){vis[v]=true;q.push(v);}}}}}return dist[end]!=inf;
}int MCMF(int begin,int end){int ans=0,flow;int flow_sum=0;while(spfa(begin,end)){flow=inf;for(int i=pre[end];i!=-1;i=pre[edge[i].u])if(edge[i].c<flow)flow=edge[i].c;for(int i=pre[end];i!=-1;i=pre[edge[i].u]){edge[i].c-=flow;edge[i^1].c+=flow;}ans+=dist[end]*flow;flow_sum+=flow;}return ans;
}int main()
{//freopen("in.txt","r",stdin);while(scanf("%d%d",&n,&m)!=EOF){if(n==0 && m==0) break;for(int i=0;i<n;i++){scanf("%s",map[i]);}int hcnt=1,mcnt=1;for(int i=0;i<n;i++)for(int j=0;j<m;j++){if(map[i][j]=='H'){hp[hcnt][0]=i;hp[hcnt][1]=j;hcnt++;}if(map[i][j]=='m'){mp[mcnt][0]=i;mp[mcnt][1]=j;mcnt++;}}hcnt--;mcnt--;init();for(int i=1;i<=hcnt;i++){addedge(0,i,1,0);//addedge(i,0,1,0);
        }for(int j=1;j<=mcnt;j++){addedge(hcnt+j,hcnt+mcnt+1,1,0);//addedge(hcnt+mcnt+1,hcnt+j,1,0);
        }for(int i=1;i<=hcnt;i++)for(int j=1;j<=mcnt;j++){addedge(i,hcnt+j,1,fabs(hp[i][0]-mp[j][0])+fabs(hp[i][1]-mp[j][1]));//addedge(hcnt+j,i,1,fabs(hp[i][0]-mp[j][0])+fabs(hp[i][1]-mp[j][1]));
            }int res=MCMF(0,hcnt+mcnt+1);printf("%d\n",res);}return 0;
}
/*
2 2
.m
H.
5 5
HH..m
.....
.....
.....
mm..H
7 8
...H....
...H....
...H....
mmmHmmmm
...H....
...H....
...H....
20 20
..mm..H..H.H...HHH.m
m.H...H.....H......m
..H...mm.........m..
Hm.m..H.H...H..m....
mH.Hm....mH........H
m............m......
.m..H...........H..m
H.m.H.....H.......m.
...m..Hm.....m.H...H
..H...H....H......mH
..m.m.....m....mm...
..........H.......H.
...mm......m...H....
.....m..H.H......m.m
.H......mm.H.m.m.m.m
HH..........HH..HH..
...m..H........Hm...
....H.....H...mHm...
H...........m......m
....m...H.m.....m...
20 20
...Hm.m.HHH...Hmm...
.H........m.......H.
.......H...H.H......
....HmH.m....Hm..m..
....m..m............
H..H.........m....H.
.m.H...m...mH.m..H..
.mH..H.H......m...m.
...mH...H.......m...
..Hm..H..H......m.m.
..mH...H.m..m.H..HH.
m.m......m........m.
...mH..m.....mH.....
....m.H.H..........H
....H.......H....m.H
H.mH.......m.......H
..............m.HH.H
..H.........m.m.m...
.........mH.....mmm.
...mH.m.m.....H..m..
20 20
H.H.......H....m....
.....m..H......H..H.
...H..............m.
mH..mm..m...H.......
......H....mm.H.....
.mH..mm.....mH.H...H
.........HHH........
......H.H...mm......
.m..m.H...mHmm...HH.
mm..Hmm.H..m...m.H.m
H.Hm.m.m.....m......
...........m.......H
......m......H...m..
....H..........Hm...
.H..H.m....m........
...H....Hm..........
m.H.mHm.m.m...H...H.
.m..........m.......
H......H...HmHHm..H.
..H..m.m...m.H..H...
20 20
.m..m..Hm...........
.m..H.H...m.m.m...H.
........m..mH....H..
..H...........Hm.H.m
H..H.m........mm..m.
H.......m...........
..m..Hmmmm...m..mH..
..H.Hm...H..........
H....m.......mm.....
....m..m.....m.....m
.H.m.H...H.....H....
.m........mm..H...H.
..m.......H.mH..mm.H
.......Hm...HH....H.
...mm....HHH........
..H.m..H........m...
H.........H.........
HH.H.....m.H..Hm....
...H.m...H.Hm.....m.
.H..mH..H..H........
20 20
m.........m.......m.
..m.H....m....m...m.
m...H.m.....H.H.....
.....H.Hm.m...m.....
..mH...H.H.m.H...H..
H....H......m.....m.
..................H.
.m..m.Hm......m..H..
....H..H.m.....H...H
....m.H......m.H...m
....HH...H...H......
..H.....m......H.H..
mmH...mmm.....m.....
..m.......m...mmH...
......H.H..m...Hm..H
HHHm.H.m........H...
...mHm.......m....m.
.....mmH.H..H.....m.
......m..H.....m...H
..HH..m...mH......H.
20 20
m.HHm..HH..m.mHm....
mm..H...............
m...HH.......m.H....
..mH.m.m.......mmH..
H.m........m.......H
m.H....m....m..m...H
....m......mm.......
.m.H....m..H..m..H..
H....m......H.......
...H...........m.m.H
......H...m...H..m..
.mH..H.H.....m......
...m.....m.H...HmH.H
m.......H..H.H..mm.H
...H.........Hm.HH..
.m....H.....m.HHm...
...HHH...........m..
m............H......
.....m..mm.....m....
.....m..H..H..H....H
20 20
....H.............m.
.....HH..mH..Hm..H..
m...........mH....mm
..m..m.H......m....m
.H..........mHH....m
...........m..H.m...
..H...H.........mHm.
......H...........H.
H.....H.....H..m....
H.H..H..m...m..mH.m.
....H...m.H.mHmm.mHm
..mmm...H....m....H.
.........m..m.......
.m.H....Hm....m.....
.....H.......HH...mH
..H..H....m.m.....HH
.Hm.............H...
H...Hm.......H.m.m..
.....m..HH...H.....m
........mHmmH..m....
20 20
.....H.......H...m.m
.m..H.m.m....m......
m.H.HHH..mm.........
H...mH.mH...........
..mHm..m.m......m..m
H.HH.....m...m......
H.mH....H......H....
...mH.m.mHmH...H....
........H.....m.....
..H.......HmH...H...
......m...HH.m......
.H..m.H...H.........
...H...m..m..m...m..
.mH..HH......m...H.....m....H.H.H.m.....
.........H.m........
..m..H...H......H...
mmH..mH.....m.H..H..
H....mm...H.m...m.mm
......m.............
20 20
....mH..m...m.....m.
..m......mHm...H....
.H.....mHm....H..H..
...HH..........m.m..
..m..mm........m....
...m.....H..........
..mH..H...m.........
...H.H.....m..mH..m.
..H.........Hm.Hm..H
...........H......m.
.............H...mm.
H.m.....Hm.H.m......
....Hm..m..mm.H...m.
...H.H.H......H.Hm..
H.m............m....
..mH.m.m...m..H.m..H
HH.H....m.H..H...m..
.....H.....H...H...H
........mH.HHm.....m
.H.H.....mmH......m.
20 20
.mH........m.mmH..H.
m....H........H..H..
.........Hm.m.m.....
....H.H...m.........
.H....m.............
HH.....H.....H.HH...
mmmmmm.H..m..m......
.Hm.H...H.H..m.H....
.........m..m.mHmHH.
...m.m....m..H.Hm..H
...Hm....H..m....m..
...mH.....m.......m.
.H...HmmH..H.....H..
m.H...m.....mmH....H
.m.H......m...H.....
H........m..Hm......
.......m...........m
...m........m...H...
.........m...H......
HH..H..m...H......H.
*/

转载于:https://www.cnblogs.com/markliu/archive/2012/05/23/2514644.html

POJ-2195(最小费用最大流)相关推荐

  1. poj 2516(最小费用最大流)

    其实题意很明确,最小费用最大流, 但是我这2货就建图就太二了, 我把所有的情况都弄到一个图里面. 总的点数有5000个,加上这么多的边,果断TLE... 后面知道第k个的情况是独立的,所以可以分成K次 ...

  2. poj 2516 最小费用最大流

    最佳匹配的题,m个仓库供应k种商品给n个商家,m*n条运输代价互异,求满足商家需求下的最小运输费用 显然,如果某种商品的供货量比需求大,肯定是无法达到要求的,所以开始要判别是否可以得到最佳匹配 这个题 ...

  3. POJ 2135 最小费用最大流

    思路: 源->1连费用0 流量2 其它的边 费用w 流量1 n->汇 费用0 流量2 最小费用流 搞定~ //By SiriusRen #include <queue> #in ...

  4. POJ - 2195 Going Home(二分图最小权匹配+KM+思维建边/最小费用最大流)

    题目链接:点击查看 题目大意:给出一个n*m的地图,现在有一定数量的小人要回到屋子里去,题目保证图中的小人和屋子的数量是一致的,小人回到小屋的距离是两个点坐标的曼哈顿距离,每个小屋只能容纳一个小人,现 ...

  5. POJ 2195 Going Home 最小费用最大流

    这题目同时也可以用KM()算法做,最求小权值匹配而已,权值设置为负数就行,具体KM算法参照:http://blog.csdn.net/cnh294141800/article/details/1895 ...

  6. POJ 2135 Farm Tour (最小费用最大流)

    Description 给出一张\(N\)个点\(M\)条边的带权无向图,结点编号从\(1\)到\(N\),求从\(1\)到\(N\)再到\(1\)的最短路,每条边最多走一次. Input 第一行给出 ...

  7. POJ - 2516 Minimum Cost 最小费用最大流

    题目链接 题意:给n,m,k表示商店数,储存店数,种类数 然后给n*k表示每个水果店需求每种种类的数量: 表示成 need[i][j] 再给m*k表示每个储存店每种种类数量: 表示成store[i][ ...

  8. POJ - 2175 Evacuation Plan(最小费用最大流+消圈定理)

    题目链接:点击查看 题目大意:给出n个建筑物和m个避难所,每个建筑物中的人需要到避难所中去避难,规定花费是建筑物和避难所的曼哈顿距离+1,现在给出一种路线方案,问这个方案是不是最优的,如果不是,输出比 ...

  9. POJ - 2516 Minimum Cost(最小费用最大流)

    题目链接:点击查看 题目大意:给出n个买家,m个货点,以及k种货物,接下来按照顺序依次给出一个n*k的矩阵,表示每个买家对于每种货物的需求,一个m*k的矩阵,表示每个货点能供给货物的数量,k个n*m的 ...

  10. POJ - 2135 Farm Tour(最小费用最大流)

    题目链接:点击查看 题目大意:给出一个由n个点和m条边组成的无向图,每条边都有权值,求点1->点n->点1的最短路,且要求每条路至多经过一次,并使得途径的权值和最小 题目分析:虽然题目要求 ...

最新文章

  1. 我是Redis,MySQL大哥被我害惨了!
  2. 在Ubuntu16.04上安装CUDA
  3. mysql获取用户名_mysql-LEFT JOIN 3列获取用户名
  4. quartz可以指定方法名吗_大理石可以自己抛光吗?大理石自己抛光方法解答
  5. 了解单片机及单片机的控制原理和 DX516 的用法,控制一个 LED 灯的亮
  6. nginx log记录请求响应日志及日志分割
  7. 冠榕智能灯光控制协议分析(controller init)
  8. 职场十个方法 让专业气质成为你的符号!
  9. centos 对某ip开放 防火墙端口_CentOS操作系统防火墙Firewalld记录日志及用途
  10. mac永久更换php默认版本,mac如何修改默认php
  11. VB讲课笔记11:多重窗体与环境应用
  12. Spring Cloud整合Nacos实现动态配置
  13. Flink】Flink连接prometheus 端口报错 Invalid host/port configuration. Host xxx Port -1
  14. STM32软件IIC速度
  15. 数据分析师面试简历怎么做?
  16. 杂记之视频监控基础之IPCAM
  17. 交友结婚的原则[转贴]
  18. banner文字生成器 横幅文字生成器
  19. (每日一练python)组合总和
  20. UE 在C++中生成一个基于蓝图的Actor

热门文章

  1. [转载]读史记札记23:并不是每次跌倒都能够重新站起来
  2. 看视频笔记1【wpf】
  3. 推荐两个Firefox插件
  4. 什么文件格式可以通过流来直接读取或写入
  5. 阿里云 yum无法正常使用的解决办法 (转)
  6. Mac OS X 10.8.X编译Android4.2.X源码不生成emulator的问题
  7. Windows SharePoint Services 3.0 Step By Step翻译
  8. Spring JMS
  9. mysql 5.6 初始化_MySQL 5.6 关于登陆的初始化设置
  10. hdu3746 KMP的next数组应用,求项链首尾项链循环