poj2195
题解:
简单KM
把每一个男的和房子分离
代码:
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
const int NN=,MM=;
int a[NN][NN],v[NN][NN],g[NN][NN],lk[MM],lx[MM],ly[MM];
int visx[MM],visy[MM],slack[MM],N,M,n,n1,n2,cnt,ans;
int dfs(int x)
{
visx[x]=cnt;
for (int y=;y<=n;y++)
{
if (visy[y]==cnt) continue;
int t=lx[x]+ly[y]-g[x][y];
if (!t)
{
visy[y]=cnt;
if (!lk[y]||dfs(lk[y])){lk[y]=x;return ;}
}
else if (slack[y]>t) slack[y]=t;
}
return ;
}
void KM()
{
memset(lk,,sizeof(lk));
memset(lx,,sizeof(lx));
memset(ly,,sizeof(ly));
for (int i=;i<=n;i++)
for (int j=;j<=n;j++)lx[i]=max(lx[i],g[i][j]);
for (int x=;x<=n;++x)
{
for (int i=;i<=n;i++)slack[i]=1e9;
while (cnt++,!dfs(x))
{
int d=1e9;
for (int i=;i<=n;i++)
if (visy[i]!=cnt) d=min(d,slack[i]);
for (int i=;i<=n;i++)
{
if (visx[i]==cnt) lx[i]-=d;
if (visy[i]==cnt) ly[i]+=d;
else slack[i]-=d;
}
}
}
return;
}
void work()
{
n1=n2=ans=;
for (int i=;i<=N;i++)
for (int j=;j<=M;j++)
{
for (a[i][j]=getchar();a[i][j]!='.'&&a[i][j]!='m'&&a[i][j]!='H';a[i][j]=getchar());
if (a[i][j]=='m') v[i][j]=++n1;
if (a[i][j]=='H') v[i][j]=++n2;
}
for (int i=;i<=N;i++)
for (int j=;j<=M;++j)
{
if (a[i][j]!='m') continue;
for (int p=;p<=N;p++)
for (int q=;q<=M;q++)
if (a[p][q]=='H') g[v[i][j]][v[p][q]]=-abs(i-p)-abs(j-q);
}
n=n1;
KM();
for (int i=;i<=n;i++)ans+=lx[i]+ly[i];
printf("%d\n",-ans);
return;
}
int main()
{
while (~scanf("%d%d",&N,&M)&&N|M) work();
return ;
}
poj2195的更多相关文章
- POJ-2195 Going Home---KM算法求最小权值匹配(存负边)
题目链接: https://vjudge.net/problem/POJ-2195 题目大意: 给定一个N*M的地图,地图上有若干个man和house,且man与house的数量一致.man每移动一格 ...
- POJ2195 Going Home —— 最大权匹配 or 最小费用最大流
题目链接:https://vjudge.net/problem/POJ-2195 Going Home Time Limit: 1000MS Memory Limit: 65536K Total ...
- POJ-2195(最小费用最大流+MCMF算法)
Going Home POJ-2195 这题使用的是最小费用流的模板. 建模的时候我的方法出现错误,导致出现WA,根据网上的建图方法没错. 这里的建图方法是每次到相邻点的最大容量为INF,而花费为1, ...
- POJ2195 Going Home[费用流|二分图最大权匹配]
Going Home Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 22088 Accepted: 11155 Desc ...
- POJ2195 最小费用流
题目:http://poj.org/problem?id=2195 处理出每个人到每个门的曼哈顿距离,分别建立容量为1费用为曼哈顿距离的边,在源点和每个人人之间建立容量为1费用为0的边,在门和汇点之间 ...
- POJ2195 Going Home
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 22091 Accepted: 11156 Description On ...
- POJ2195 Going Home 【最小费用流】+【最佳匹配图二部】
Going Home Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 18169 Accepted: 9268 Descr ...
- poj-2195(最小费用流)
题意:给你一个n*m的地图,H代表这个点有一个房子,m代表这个点是一个人,每次h走一步就花费一,问最小花费使得每个人能进入一个房间 代码:建立一个源点和汇点,每个人和源点相连,每个房子和汇点相连,每个 ...
- POJ2195&&HDU1533(KB11-D 最小费用最大流)
Going Home Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 23515 Accepted: 11853 Desc ...
- POJ2195:Going Home(费用流入门)
http://poj.org/problem?id=2195 #include <iostream> #include <stdio.h> #include <strin ...
随机推荐
- C/C++之Qt正则表达式
引言 正则表达式(regular expression)就是用一个“字符串”来描述一个特征,然后去验证另一个“字符串”是否符合这个特征.比如 表达式“ab+” 描述的特征是“一个 'a' 和 任意个 ...
- python中统计计数的几种方法
以下实例展示了 count() 方法的使用方法: 1 2 3 4 5 6 # !/usr/bin/python3 T = (123, 'Google', 'Runoob', 'Taobao', 1 ...
- thinkerCMS是一款thinkphp写的微型cms框架可以参考下
http://www.thinkphp.cn/code/1764.html thinkphp官网thinkercms介绍 http://cms.thinke ...
- [.net基础]访问修饰符
标题:[.net基础]访问修饰符 一.前言 基础掌握不牢固啊,所以记录下来. 二.方法访问修饰符Internal (1).创建工程ParentAndSon (2).添加类ModelA namespac ...
- 如何升级到python3版本并且安装pip3
如何升级到python3版本并且安装pip3 准备: Python-3.5.2.tar.xz pip-8.1.2.tar.gz setuptools-24.0.2.zip 步骤: 1.自定义编译安装p ...
- MongoDB-与Python交互
与python交互 点击查看官方文档 安装python包 进入虚拟环境 sudo pip install pymongo 或源码安装 python setup.py 引入包pymongo import ...
- BZOJ 3192: [JLOI2013]删除物品 奇淫技巧&树状数组
点我看题 这题十分奇淫技巧...QAQ因为知道是树状数组的题QAQ刚开始以为维护两个数组的树状数组然后模拟从大到小,然后发现不会打QAQ 于是悄悄咪咪翻开题解了. 实际上两个数组可以看做一个数组 如 ...
- scala(一)方法&函数
写在前面 众所周知,scala一向宣称自己是面向函数的编程,(java表示不服,我是面向bean的编程!)那什么是函数? 在接触java的时候,有时候用函数来称呼某个method(实在找不出词了),有 ...
- JAVA小工具打包
D: cd D:\xxx\IPOSpider javac -d bin/ src/com/xxx/IPOSpider.java src/com/xxx/ConfigProperties.java -c ...
- Hadoop 常用指令
1. 察看hdfs文件系统运行情况 bin/hdfs dfsadmin -report 2. 为了方便执行 HDFS 的操作指令,我们可以将需要的 Hadoop 路径写入环境变量中,便于直接执行命令. ...