题目大意:一个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【最小费用流 二分图最优匹配】的更多相关文章

  1. poj 2195 二分图最优匹配 或 最小费用最大流

    就是最基本的二分图最优匹配,将每个人向每个房子建一条边,权值就是他们manhattan距离.然后对所有权值取反,求一次最大二分图最优匹配,在将结果取反就行了. #include<iostream ...

  2. 51nod 算法马拉松4 D装盒子(网络流 / 二分图最优匹配)

    装盒子   基准时间限制:1 秒 空间限制:131072 KB 分值: 160 有n个长方形盒子,第i个长度为Li,宽度为Wi,我们需要把他们套放.注意一个盒子只可以套入长和宽分别不小于它的盒子,并且 ...

  3. [hdu2255]奔小康赚大钱(二分图最优匹配、KM算法)

    题目大意:求二分图的最优匹配(首先数目最大, 其次权值最大). 解题关键:KM算法 复杂度:$O(n^3)$ #include<cstdio> #include<cstring> ...

  4. POJ 2195 Going Home 【二分图最小权值匹配】

    传送门:http://poj.org/problem?id=2195 Going Home Time Limit: 1000MS   Memory Limit: 65536K Total Submis ...

  5. POJ 2195 Going Home 最小费用流 裸题

    给出一个n*m的图,其中m是人,H是房子,.是空地,满足人的个数等于房子数. 现在让每个人都选择一个房子住,每个人只能住一间,每一间只能住一个人. 每个人可以向4个方向移动,每移动一步需要1$,问所有 ...

  6. POJ 2195 Going Home 最小费用流 难度:1

    Going Home Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 17955   Accepted: 9145 Descr ...

  7. POJ 2195 Going Home 最小费用流

    POJ2195 裸的最小费用流,当然也可以用KM算法解决,但是比较难写. 注意反向边的距离为正向边的相反数(因此要用SPFA) #include<iostream> #include< ...

  8. poj 3565 二分图最优匹配

    思路: 将ant与tree之间用距离来做权值,求最小权匹配就可以了.可以想到,如果有两条线段相交,那么将这两个线段交换一个顶点,使其不相交,其权值和一定会更小. 就像斜边永远比直角边长一样的道理. # ...

  9. 网络流——二分图最优匹配KM算法

    前言 其实这个东西只是为了把网络流的内容凑齐而写的(反正我是没有看到过这样子的题不知道田忌赛马算不算) 算法过程 我们令左边的点(其实二分图没有什么左右)为女生,右边的点为男生,那么: 为每一个女生定 ...

随机推荐

  1. spark block读写流程分析

    之前分析了spark任务提交以及计算的流程,本文将分析在计算过程中数据的读写过程.我们知道:spark抽象出了RDD,在物理上RDD通常由多个Partition组成,一个partition对应一个bl ...

  2. UVA6531Go up the ultras

    链接 这题意甚是难懂..当且峰值为h 如果他能为ultras 需要满足条件 d>=15W d满足它到任意一个比它高的点须经过h-d这个点 通俗一点来说,如果这个点满足条件 就找离他最近的一个&l ...

  3. P1597 语句解析

    题目背景 木有背景…… 题目描述 一串(<255)PASCAL语言,只有a,b,c 3个变量,而且只有赋值语句,赋值只能是一个一位的数字或一个变量,未赋值的变量值为0.输出a,b,c 最终的值. ...

  4. C#之九大视图

    本节向大家介绍一下有关UML视图方面的内容,UML视图共有9种,它们之间有什么区别和联系呢,下面就让我们一起来学习吧,相信通过本节的介绍你一定会有不少收获. UML视图 UML总共提供了9种视图,这些 ...

  5. 大型Java Web项目的架构和部署问题

    一位ID是jackson1225的网友在javaeye询问了一个大型Web系统的架构和部署选型问题,希望能提高现有的基于Java的Web应用的服务能力.由于架构模式和部署调优一直是Java社区的热门话 ...

  6. js运行机制(线程)

    浏览器线程 js运作在浏览器中,是单线程的,即js代码始终在一个线程上执行,这个线程称为js引擎线程. 浏览器是多线程的,除了js引擎线程,它还有:  UI渲染线程 浏览器事件触发线程 http请求线 ...

  7. $.noconflict() 有什么用处

    jQuery默认使用"$"操作符,prototype等其他框架也是是使用"$",于是,如果jQuery在其他库之后引入,那么jQuery将获得"$&q ...

  8. LinuxMint 编译 LittlevGL GUI

    编译必须 安装arm-linux-gcc-4.4.3.tar.gz PC simulator You can try out the Littlev Graphics Library using on ...

  9. JavaSE-26 Swing

    学习要点 关于Swing Swing容器组件 Swing布局管理器 Swing组件 Swing菜单组件 关于Swing Swing和AWT都是java开发图形用户界面的工具包. AWT:早期Java版 ...

  10. QT5:第二章 布局排版控件

    一.简介 在QT组件面板中有Layouts和Spacers两个组件面板 注意:布局排版控件不显示 1.Layouts(布局) Vertical Layout:垂直方向布局,组件自动在垂直方向上分布 H ...