POJ 2195 Going Home【最小费用流 二分图最优匹配】
题目大意:一个n*m的地图,上面有一些人man(m)和数量相等的house(H) 图上的距离为曼哈顿距离 问所有人住进一所房子(当然一个人住一间咯)距离之和最短是多少?
思路:一个人一间房,明显是二分图的模型,边权为人和房子的曼哈顿距离,然后算一下最小距离即可 懒得学KM了 最小费用流的经典建图
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
#include <iostream>
#define maxn 40000
#define inf 0x3f3f3f3f
using namespace std;
struct POINT
{
int x;
int y;
}a[maxn],b[maxn];
int head[maxn],root[maxn],point[maxn],next[maxn];
int flow[maxn],cost[maxn],pre[maxn],now=0,dist[maxn];
int n,m,h,h2;
char ch[maxn];
int mabs(int x)
{
return x>0?x:-x;
}
int distanc(int i,int j)
{
return mabs(a[i].x-b[j].x)+mabs(a[i].y-b[j].y);
}
void add(int x,int y,int v,int c)
{
next[++now]=head[x];
head[x]=now;
point[now]=y;
flow[now]=v;
cost[now]=c;
root[now]=x;
next[++now]=head[y];
head[y]=now;
point[now]=x;
flow[now]=0;
cost[now]=-c;
root[now]=y;
}
int spfa(int s,int t)
{
memset(pre,0,sizeof(pre));
for(int i=0;i<=t;i++)dist[i]=inf;
dist[s]=0;
int visit[maxn]={0};
visit[s]=1;
queue<int>q;
q.push(s);
while(!q.empty())
{
int u=q.front();
q.pop();
visit[u]=0;
for(int i=head[u];i;i=next[i])
{
int k=point[i];
if(dist[u]+cost[i]<dist[k] && flow[i]!=0)
{
pre[k]=i;
dist[k]=dist[u]+cost[i];
if(!visit[k])
{
visit[k]=1;
q.push(k);
}
}
}
}
return dist[t]!=inf;
}
int main()
{
while(1)
{
scanf("%d%d",&n,&m);
if(n==0&&m==0)break;
now=0;
memset(head,0,sizeof(head));
int ans=0;
h=h2=0;
for(int i=1;i<=n;i++)
{
scanf("%s",ch+1);
for(int j=1;j<=m;j++)
{
if(ch[j]=='H')a[++h].x=i,a[h].y=j;
else if(ch[j]=='m')b[++h2].x=i,b[h2].y=j;
}
}
for(int i=1;i<=h;i++)
{
for(int j=1;j<=h;j++)
{
int u=distanc(i,j);
add(j,i+h+1,1,u);
}
}
int s=h*2+10,t=h*2+11;
for(int i=1;i<=h;i++)add(s,i,1,0);
for(int i=1;i<=h;i++)add(i+h+1,t,1,0);
while(spfa(s,t))
{
int e=pre[t],minx=flow[e];
while(e)
{
if(flow[e]<minx)minx=flow[e];
e=pre[root[e]];
}
e=pre[t];
while(e)
{
flow[e]-=minx;
flow[((e-1)^1)+1]+=minx;
e=[root[e]];
}
ans+=dist[t]*minx;
}
printf("%d\n",ans);
}
return 0;
}
POJ 2195 Going Home【最小费用流 二分图最优匹配】的更多相关文章
- poj 2195 二分图最优匹配 或 最小费用最大流
就是最基本的二分图最优匹配,将每个人向每个房子建一条边,权值就是他们manhattan距离.然后对所有权值取反,求一次最大二分图最优匹配,在将结果取反就行了. #include<iostream ...
- 51nod 算法马拉松4 D装盒子(网络流 / 二分图最优匹配)
装盒子 基准时间限制:1 秒 空间限制:131072 KB 分值: 160 有n个长方形盒子,第i个长度为Li,宽度为Wi,我们需要把他们套放.注意一个盒子只可以套入长和宽分别不小于它的盒子,并且 ...
- [hdu2255]奔小康赚大钱(二分图最优匹配、KM算法)
题目大意:求二分图的最优匹配(首先数目最大, 其次权值最大). 解题关键:KM算法 复杂度:$O(n^3)$ #include<cstdio> #include<cstring> ...
- POJ 2195 Going Home 【二分图最小权值匹配】
传送门:http://poj.org/problem?id=2195 Going Home Time Limit: 1000MS Memory Limit: 65536K Total Submis ...
- POJ 2195 Going Home 最小费用流 裸题
给出一个n*m的图,其中m是人,H是房子,.是空地,满足人的个数等于房子数. 现在让每个人都选择一个房子住,每个人只能住一间,每一间只能住一个人. 每个人可以向4个方向移动,每移动一步需要1$,问所有 ...
- POJ 2195 Going Home 最小费用流 难度:1
Going Home Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 17955 Accepted: 9145 Descr ...
- POJ 2195 Going Home 最小费用流
POJ2195 裸的最小费用流,当然也可以用KM算法解决,但是比较难写. 注意反向边的距离为正向边的相反数(因此要用SPFA) #include<iostream> #include< ...
- poj 3565 二分图最优匹配
思路: 将ant与tree之间用距离来做权值,求最小权匹配就可以了.可以想到,如果有两条线段相交,那么将这两个线段交换一个顶点,使其不相交,其权值和一定会更小. 就像斜边永远比直角边长一样的道理. # ...
- 网络流——二分图最优匹配KM算法
前言 其实这个东西只是为了把网络流的内容凑齐而写的(反正我是没有看到过这样子的题不知道田忌赛马算不算) 算法过程 我们令左边的点(其实二分图没有什么左右)为女生,右边的点为男生,那么: 为每一个女生定 ...
随机推荐
- Centos 6.5安装MySQL-python
报错信息: Using cached MySQL-python-1.2.5.zip Complete output from command python setup.py egg_info: ...
- Win7下单机版的伪分布式solrCloud环境搭建Tomcat+solr+zookeeper【转】
Win7下单机版的伪分布式solrCloud环境搭建Tomcat+solr+zookeeper 1.软件工具箱 在本文的实践中,需要用到以下的软件: Tomcat-7.0.62+solr-5.0.0+ ...
- C#中分部类和分部方法的应用
本篇文章介绍了,C#中分部类和分部方法的应用.需要的朋友参考下 分部类(Partial Class)在C#2.0引入,分部方法(Partial Method)在C#3.0引入,这两个语法特性都 ...
- Springboot 1.X 在Weblogic 中的发布
springboot在tomcat中的兼容性很好,但是如果要把Springboot项目发布在weblogic,尤其是老版本的Weblogic就会出现各种问题.经过本人的不懈努力及查询资料,终于将Spr ...
- Elasticsearch (1) - 索引库 文档 分词
创建索引库 ES的索引库是一个逻辑概念,它包括了分词列表及文档列表,同一个索引库中存储了相同类型的文档.它就相当于MySQL中的表,或相当于Mongodb中的集合. 关于索引这个语: 索引(名词):E ...
- 【数据分析 R语言实战】学习笔记 第七章 假设检验及R实现
假设检验及R实现 7.1假设检验概述 对总体参数的具体数值所作的陈述,称为假设;再利用样本信息判断假设足否成立,这整个过程称为假设检验. 7.1.1理论依据 假设检验之所以可行,其理沦背景是小概率理论 ...
- ubuntu 下service php5-fpm restart 报错 stop: Unknown instance: 解决
问题描述: 在安装完扩展后,重启php-fpm,发现一直停止报错 stop: Unknown instance: 通过查看进程,也查询不到该主进程 解决办法: 干掉现在正在执行的进程 pkill ph ...
- Ubuntu系统下配置PHP支持SQLServer 2005
最近在做一个项目,该项目的数据库是微软公司的的SQLserver ,数据库安装在另一台windows服务器上,而项目却部署在ubuntu server上.那么这样就会涉及到项目在linux上如何链接S ...
- 十分钟搭建App主流框架
搭建主流框架界面 0.达成效果 Snip20150904_5.png 我们玩iPhone应用的时候,有没发现大部分的应用都是上图差不多的结构,下面的TabBar控制器可以切换子控制器,上面又有Navi ...
- Python基础3 函数 变量 递归 -DAY3
本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数 温故知新 1. 集合 主要作用: 去重 关系测 ...