poj 2195 - Going Home 二分图最优匹配 ek
来源:互联网 发布:js 设置div不可用 编辑:程序博客网 时间:2024/05/03 21:55
在一个地图上给出房子的位置和人的位置,人和房子的数量是相等的。人要回到房子里,每个房子只能回一个人。人向房子每移动一个单位需要花费$1,求人全部回房子的最小花费。
ACcode:
#pragma warning(disable:4786)//使命名长度不受限制#pragma comment(linker, "/STACK:102400000,102400000")//手工开栈#include <map>#include <set>#include <queue>#include <cmath>#include <stack>#include <cctype>#include <cstdio>#include <cstring>#include <stdlib.h>#include <iostream>#include <algorithm>#define rd(x) scanf("%d",&x)#define rd2(x,y) scanf("%d%d",&x,&y)#define rds(x) scanf("%s",x)#define rdc(x) scanf("%c",&x)#define ll long long int#define maxn 105#define mod 1000000007#define INF 0x3f3f3f3f //int 最大值#define FOR(i,f_start,f_end) for(int i=f_start;i<=f_end;++i)#define MT(x,i) memset(x,i,sizeof(x))#define PI acos(-1.0)#define E exp(1)using namespace std;struct P{int x,y;};P man[maxn],house[maxn];int mm,hh,n,m,res;int a[maxn],b[maxn],match[maxn],slack[maxn],mp[maxn][maxn];bool visa[maxn],visb[maxn];char str[maxn];bool find_path(int u){ visa[u]=true; FOR(j,0,hh-1){ if(!visb[j]&&a[u]+b[j]==mp[u][j]){ visb[j]=true; if(match[j]==-1||find_path(match[j])){ match[j]=u; return true; } } else if(a[u]+b[j]>mp[u][j]) slack[j]=min(slack[j],a[u]+b[j]-mp[u][j]); } return false;}void km(){ MT(a,0);MT(b,0);MT(match,-1); FOR(i,0,mm-1) FOR(j,0,hh-1) a[i]=max(mp[i][j],a[i]); FOR(i,0,mm-1){ FOR(j,0,hh-1)slack[j]=INF; while(true){ FOR(j,0,maxn){visa[j]=visb[j]=0;} if(find_path(i))break; int d=INF; FOR(j,0,hh-1) if(!visb[j]&&d>slack[j])d=slack[j]; FOR(j,0,mm-1) if(visa[j])a[j]-=d; FOR(j,0,hh-1) if(visb[j])b[j]+=d; else slack[j]-=d; } }}int main(){ while(rd2(n,m)&&(n+m)){ hh=mm=res=0; FOR(i,0,n-1){ rds(str); FOR(j,0,m-1){ if(str[j]=='H'){ house[hh].x=i; house[hh++].y=j; }else if(str[j]=='m'){ man[mm].x=i; man[mm++].y=j; } } } FOR(i,0,mm-1) FOR(j,0,hh-1) mp[i][j]=-(abs(man[i].x-house[j].x)+abs(man[i].y-house[j].y)); km(); FOR(j,0,hh-1) res-=mp[match[j]][j]; printf("%d\n",res); } return 0;}/*2 2.mH.5 5HH..m...............mm..H7 8...H.......H.......H....mmmHmmmm...H.......H.......H....0 0*/
0 0
- poj 2195 - Going Home 二分图最优匹配 ek
- POJ 2195 Going Home(二分图最优匹配)
- POJ 2195 Going Home(二分图最优匹配)
- poj 2195 Going Home(二分图最优匹配KM算法)
- POJ 2195 Going Home(二分图最优匹配)
- 二分图的最优匹配 going home
- hdu1533 going home 二分图最优匹配
- POJ 2195 Going Home【KM算法-二分图的最优匹配】
- poj 2195 Going Home 二分图最大权匹配
- POJ 2195 - Going Home(二分图最大权匹配)
- poj 2195 going home二分图最大匹配
- POJ 2195 Going Home [二分图带权匹配] [费用流]
- POJ 2195 Going Home(KM算法——二分图最小权匹配)
- POJ 2195 Going Home (二分图最大权匹配、KM算法)
- poj 2195 Going Home 二分图最小权匹配KM算法
- POJ 2195 Going Home(二分图最大权值匹配) KM
- POJ 2195&&HDU 1533 Going Home(KM算法解决二分图最小权匹配)
- 【poj2195】【二分图最佳匹配】Going Home
- Construct Binary Tree from Inorder and Postorder Traversal
- iOS 引入库工程遇到的问题
- iOS MRC手动内存管理 心得体会
- 专业英语之路——基本口语阶段(一)
- 一起talk C栗子吧(第六十七回:C语言实例--DIY字符串长度函数)
- poj 2195 - Going Home 二分图最优匹配 ek
- (NO.00004)iOS实现打砖块游戏(五):游戏场景类
- Oracle memory troubleshooting, Part 1: Heapdump Analyzer
- Struts2中使用servletresponse直接输出内容到客户端出现:Cannot call sendError() after the response has been committed
- (NO.00004)iOS实现打砖块游戏(六):反弹棒类
- 基础知识总结
- [nodejs入门]第一篇,javascript基础(2)
- 百度地图的使用(2)_实现定位功能
- Opencv中视频播放的控制