POJ Going Home (2195)(最小费用最大流)

POJ 2195 Going Home (最佳完美匹配, 最小费用最大流) 题目类型  最优比率生成树 题目意思 给出最多 1000 个点与这些点之间的边的长度与花费 找一棵生成树 使  Sum(边的花费) / Sum(边的长度) 的值最小 输出这个值 解题方法 01分数规划 -> 对于0-1分数规划的Dinkelbach算法的分析 这道题求的是最小值 设边的花费为行向量 [c1, c2, ... , 阅读详情


Going Home
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 22076 Accepted: 11148

Description

On a grid map there are n little men and n houses. In each unit time, every little man can move one unit step, either horizontally, or vertically, to an adjacent point. For each little man, you need to pay a $1 travel fee for every step he moves, until he enters a house. The task is complicated with the restriction that each house can accommodate only one little man. 

Your task is to compute the minimum amount of money you need to pay in order to send these n little men into those n different houses. The input is a map of the scenario, a '.' means an empty space, an 'H' represents a house on that point, and am 'm' indicates there is a little man on that point. 

You can think of each point on the grid map as a quite large square, so it can hold n little men at the same time; also, it is okay if a little man steps on a grid with a house without entering that house.

Input

There are one or more test cases in the input. Each case starts with a line giving two integers N and M, where N is the number of rows of the map, and M is the number of columns. The rest of the input will be N lines describing the map. You may assume both N and M are between 2 and 100, inclusive. There will be the same number of 'H's and 'm's on the map; and there will be at most 100 houses. Input will terminate with 0 0 for N and M.

Output

For each test case, output one line with the single integer, which is the minimum amount, in dollars, you need to pay.

Sample Input

2 2
.m
H.
5 5
HH..m
.....
.....
.....
mm..H
7 8
...H....
...H....
...H....
mmmHmmmm
...H....
...H....
...H....
0 0

Sample Output

2
10
28

Source


题意:有n*m的矩阵,H表示这个点是一个房子,m表示这个点是一个人,现在每一个人需要走入一个房间,已经知道的是认得数目和房子的个数一定是相同的,现在问这些人都回到一个房间所走的总的步数最小


分析:找这些人到这些房子的最小步数,我们可以建一个超级源点和超级汇点,源点到每个人的费用为0,距离为1

每个房子到汇点费用为0,距离为1,人到房子的距离是1,费用为坐标差的和


//数组开大一些
#include <stdio.h>
#include <string.h>
#include <queue>
#include <stdlib.h>
using namespace std;
#define inf 0x3f3f3f3f
#define N 300
struct node
{
    int u,v,cap,cost,next;

}eg[N*N];
struct node1
{
    int x,y;
}q1[N*N],q2[N*N];
char mp[200][200];
int head[N],vis[N],dis[N],pre[N];
int top;
void add(int u,int v,int cap,int cost)
{
    eg[top].u=u;
    eg[top].v=v;
    eg[top].cap=cap;
    eg[top].cost=cost;
    eg[top].next=head[u];
    head[u]=top++;

    eg[top].u=v;
    eg[top].v=u;
    eg[top].cap=0;
    eg[top].cost=-cost;
    eg[top].next=head[v];
    head[v]=top++;
}
int spfa(int s,int t)
{
    int i,j;
    for(i=1;i<=t;i++)
    {
        dis[i]=inf;
        pre[i]=-1;
        vis[i]=0;
    }
    int q[112345];
    int in=0,out=0;
    q[in++]=s;
    dis[s]=0;
    vis[s]=1;
    while(in>out)
    {
        int u=q[out++];
        vis[u]=0;
        for(i=head[u];i!=-1;i=eg[i].next)
        {
            if(eg[i].cap>0)
            {
                int v=eg[i].v;
                if(dis[v]>dis[u]+eg[i].cost)
                {
                    dis[v]=dis[u]+eg[i].cost;
                    pre[v]=i;   //i指的是以v为终点这条边在eg中的编号
                    if(!vis[v])
                    {
                        vis[v]=1;
                        q[in++]=v;
                    }
                }
            }
        }
    }
    if(dis[t]==inf)return 0;
    else return dis[t];
}
int sap(int s,int t)
{
    int i;
    int ans=0,max_flow=0;
    int flow;
    while(spfa(s,t))
    {
        for(i=1;i<=t;i++)
            printf("%d  %d \n",i,pre[i]);
        top=0;
        flow=inf;
        for(i=pre[t];i!=-1;i=pre[eg[i].u])
            if(eg[i].cap<flow)
            flow=eg[i].cap;
        for(i=pre[t];i!=-1;i=pre[eg[i].u])
        {
            eg[i].cap-=flow;
            eg[i^1].cap+=flow;
        }
        ans+=dis[t];
        max_flow+=flow;
    }
    return ans;
}
int main()
{
    int n,m,i,j;
    while(~scanf("%d%d",&n,&m))
    {
        top=0;
        memset(head,-1,sizeof(head));
        int top1=0,top2=0;
        if(n==0&&m==0)
            break;
        for(i=0;i<n;i++)
        {
            scanf("%s",mp[i]);
        }
        for(i=0;i<n;i++)
        {
            for(j=0;j<m;j++)
            {
                if(mp[i][j]=='m')
                {
                    q1[top1].x=i;
                    q1[top1++].y=j;
                }
                else if(mp[i][j]=='H')
                {
                    q2[top2].x=i;
                    q2[top2++].y=j;
                }
            }
        }
        for(i=0;i<top1;i++)
        {
            add(1,i+2,1,0);
            for(j=0;j<top2;j++)
            {
                int l=abs(q1[i].x-q2[j].x)+abs(q1[i].y-q2[j].y);
                //printf("   %d\n",l);
                add(i+2,top1+j+2,1,l);
            }
        }
        for(j=0;j<top2;j++)
            add(top1+j+2,top1+top2+2,1,0);
        int s=1,t=top1+top2+2;
        printf("%d\n",sap(s,t));



    }
    return 0;
}




掌握费用流算法:POJ2195-Going Home问题解答与实战 在讨论最小费用最大流问题之前,我们必须先了解流网络的基本概念。流网络是一个有向图,其中每条边都有一个非负容量上限,表示可以流过这条边的最大流量。流网络通常表示为G=(V, E),其中V是顶点的集合,E是边的集合,每条边(u,v)∈E都有一个容量限制c(u,v)≥0。在流网络中,通常有一对特殊的顶点,即源点s(source)和汇点t(sink)。源点是流量的起点,而汇点是流量的终点。流在网络中的流动必须满足两个基本条件:流量守恒和容量限制。 阅读详情

相关推荐

vc mfc listctrl使用虚拟列表 虚拟列表用法

note 虚拟列表可有效加载大量数据 需要处理listctrl的 LVN_GETDISPINFO 消息 使用虚拟列表 不能 使用 insert的方法插入数据,而是告诉listctrl 当前要显示多少行 使用SetItemCount函数告诉listctrl当前显示多少行 使用虚拟列表需要自己维护数据源 使用 添加list ctrl 控件 将其Owner Data 属性 设置为 True 添加...

知其所以然 398

算法学习笔记——网络流(最小费用最大流)(POJ2195 Going Home)

接上我上一篇写最大流的博客:https://blog.youkuaiyun.com/qq_52177557/article/details/119893851 二、最小费用最大流 最小费用最大流是在最大流的基础上,每条边除了流量值还有费用值,现在既要保证流量最大,还得保证费用最小。 对于最小费用最大流,只需要对最大流EK算法的bfs稍微改动一下,把bfs改成SPFA就行了!!! 放上例题: http://poj.org/problem?id=2195 题目大意:一张n*m的图,图中‘m’代表小人,‘H’代表房子,每个房

qq_52177557的博客 242

vscode使用continue插件连接LM studio的模型

本文详细介绍了如何使用VSCode的Continue插件连接LM Studio模型。主要步骤包括:在LM Studio中加载模型并设置相关参数,启动API服务,修改Continue配置文件以集成LM Studio模型,并进行测试以验证连接是否成功。通过这些步骤,用户可以将LM Studio中的预训练模型与VSCode的Continue插件无缝对接,实现高效的自然语言处理和编程辅助功能。

weixin_43590837的博客 8631

POJ2195 Going Home(最小费用最大流模板题)(附用数组建图和用链式前向星建图代码)

Going HomeTime Limit:1000MS    Memory Limit:65536KB    64bit IO Format:%lld & %llu SubmitStatusPracticePOJ 2195 Description On a grid map there are n little men and n houses. In each unit t

llzhh的博客 766

Python连接高斯数据库踩坑实录:从SASL报错到SSL安全连接的完整指南

本文详细记录了Python连接高斯数据库时遇到的SASL authentication报错及其解决方法。通过剖析SASL认证机制,对比了修改数据库配置、使用官方驱动等方案的利弊,并重点提供了通过自动化脚本生成SSL证书,实现安全、免密连接的完整指南,帮助开发者彻底解决连接难题。

weixin_28340315的博客 438

Cocos Creator 2.4 APK逆向实战:如何完整提取游戏资源并还原工程(附工具包)

本文详细介绍了针对Cocos Creator 2.4打包的APK进行逆向工程的完整流程,包括环境搭建、资源索引解析、打包文件提取、图集拆分以及工程结构还原。重点讲解了如何利用config.json和.jsb文件完整提取游戏资源,并生成可被Cocos Creator识别的工程目录与.meta文件,最终实现工程还原的目标。

h3i4j的博客 1495

poj 2195 Going Home (最小费用最大流)

大致题意: 给定一个N*M的地图,地图上有若干个man和house,且man与house的数量一致。man每移动一格需花费$1(即单位费用=单位距离),一间house只能入住一个man。现在要求所有的man都入住house,求最小费用。   解题思路: 费用流问题。   构图:        把man作为一个顶点集合U,house作为另一个顶点集合V,把U中所有点到V中所有点连线,费

Ezereal的博客 710

Mcgs 屏幕Modbus RTU通讯调试

昆仑通态屏幕作为Modbus Master 与 Modbus Slave通过RS485接口实现通信的调试记录

madao1234的博客 5573

poj 2195 Going Home(最小费最大流)

poj 2195 Going HomeDescription On a grid map there are n little men and n houses. In each unit time, every little man can move one unit step, either horizontally, or vertically, to an adjacent point.

总有那么一群人喜欢盯着我的博客看,估计这是他们见过最长的博客名,我必须得告诉他们博客名最长可以写多长 926

【半桥LLC】半桥LLC谐振开环闭环软启动DCDC变换器的设计与仿真

本文详细分析了半桥LLC谐振DC-DC变换器的开环与闭环控制设计原理,重点探讨了软启动功能的实现。通过仿真验证,展示了开环与闭环情况下的电压输出差异以及系统效率的提升。该研究为提高DC-DC变换器性能提供了参考。

2401_84610415的博客 2598

金智维KRPA实战:Excel自动化数据处理全流程解析

本文详细解析了金智维KRPA在Excel自动化数据处理中的全流程应用,涵盖COM接口和文件读写两种核心技术方案,以及销售报表生成、数据清洗和可视化仪表盘等实战案例。通过企业级应用的异常处理、性能优化和安全合规实践,显著提升数据处理效率和准确性,助力企业降本增效。

weixin_30329623的博客 598

POJ 2195 Going Home 【最小费用最大流】

题目链接:http://poj.org/problem?id=2195 Time Limit:1000MS Memory Limit:65536K Total Submissions:27150 Accepted:13536 Description On a grid map there are n little me...

a6334167的博客 154

SAP-ABAP:SAP数据库视图(Database View)详解-创建

数据库视图是SAP中实现多表关联查询的基础工具,适合简单的跨表查询和权限控制场景。但其功能有限,对于复杂逻辑或高性能需求,建议结合CDS视图或ABAP程序开发。通过合理设计,数据库视图可显著提升开发效率和系统可维护性。它存储在数据库中,但本身不存储数据,仅通过查询动态生成结果。是一种基于物理数据库表的虚拟表,通过关联多个表(使用。

baidu_35680696的博客 1370

POJ - 2195 Going Home 最小费用最大流

题目链接:https://vjudge.net/problem/POJ-2195 题意:n个人,n个房子,让每个人都回到一个房子里面,使得所有人走的步数和最小 题解:建一个源点,分别指向人,对应flow为1,cost为0,建一个汇点所有房子指向他,flow为1,cost为0,跑一下最小费用最大流即可。 #include <iostream> #include <cstdi...

还我笑颜 250

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

POJ-2195 Going Home(最小费用最大流模板)

题目链接:POJ-2195 Going Home 题意 给出$N$行$M$列的网格,'m'表示人,'H'表示房子,且'm'和'H'的数量相同,一个人只能进一间房子,一间房子也只能给一个人进去,人可走上下左右四个方向,现在要让所有人进入房子,求最短路径和。 思路 这是一个二分图带权最小匹配问题,可直接用最小费用最大流求解。 源点向人各连一条容量为1,费用为0的边,每个人向每间...

weixin_30911809的博客 128

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Going Home POJ - 2195 费用流

传送门:POJ2195 题意:给定n*m矩阵,矩阵中的'H'代表房子,'m'代表人,人可以上下左右移动,每移动一次要花一单位费用,每个房子只能住一个人,问每人到达一个房子的最少花费总和是多少。 思路:感觉和以前做过的某个搜索题很像,不过这里同一点可以同时容纳多人,只是一个人房子只能住一个人,将每个房子和每个人建边,流量限制为1,花费为曼哈顿距离,然后就可以用最小费用最大流求解了。 代码:

WA是一笔财富 330

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【poj-2195】 Going Home(二分图带权匹配+最小费用最大流)

描述传送门:poj-2195  On a grid map there are n little men and n houses. In each unit time, every little man can move one unit step, either horizontally, or vertically, to ...

x_Armin的博客 347

POJ 2195 Going Home (最小费用最大流)

题意:给出一张n*m的图,有k个人、k间房子,求使得每个人都走进房子的最短总路程。 题解:最小费用最大流 按照源点->房子->人->汇点建图,房子到人之间的费用,就是两两之间的曼哈顿距离,容量都是1。 这里用的spfa。 #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<cstdio> #include<string> #include<cstring> #include&

gongyuandaye的博客 323

POJ2195 Going Home——最小费用最大流

点这里 题意: 在一个n*m的图上,会有相同数量的小人和房子。要求将所有的小人都送到房子里,规则是一个小人对应一个房子,并且小人到达房子的花费为他们之间的曼哈顿距离(横纵距离之和)。问将所有小人都送到房子里的最小花费是多少。 题解: 这个题目还是很容易想到是最小费用最大流的,一个房子对应一个小人就是流,小人到达房子的花费就是费用,然后就最小费用。建模也不难,只要记录每个小人和每个房子的坐标,在所有的小人和房子之间,都加上一条费用为他们之间的曼哈顿距离、容量为1的边。另外定义一个超级源点S,连接...

lllllan 229

POJ 2195 Going Home 最小费用最大流(模板题)

以下来自点击打开链接 最小费用最大流     通过EK,Dinic,ISAP算法可以得到网络流图中的最大流,一个网络流图中最大流的流量max_flow是唯一的,但是达到最大流量max_flow时每条边上的流量分配f是不唯一的。      如果给网络流图中的每条边都设置一个费用cost,表示单位流量流经该边时会导致花费cost。那么在这些流量均为max_flow的流量分配f中,

Masamiiiiii 835

D - Going Home POJ - 2195 网路流 - 最小费用最大流

D - Going Home POJ - 2195 #include &lt;cstdio&gt; #include &lt;iostream&gt; #include &lt;algorithm&gt; #include &lt;cstring&gt; #include &lt;vector&gt; #include &lt;queue&gt; #include &lt;stack&amp

凝望的博客 274

POJ-2195-Going Home(最小费用最大流)

链接: https://vjudge.net/problem/POJ-2195 题意: 黄弘毅突然兴致大发准备免费送房子,m表示人,H表示房子,每个房子只能进一个人,房子数等于人数。黄弘毅为了方便起见决定要让所有人到自己的房子的距离和最小,请问这个距离和是多少? 思路: 最小费用最大流. 每个人连到每个房子. 代码: #include <iostream> #include ...

weixin_30693683的博客 170

POJ2195 Going Home 最小费用最大流

POJ 2195 Going Home 二分图的最大权匹配 Going Home Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 25567   Accepted: 12838 Description On a grid map there are n little men and n ...

紫芝的博客 1838

Going Home POJ - 2195 (最小费用最大流)

On a grid map there are n little men and n houses. In each unit time, every little man can move one unit step, either horizontally, or vertically, to an adjacent point. For each little man, you need t...

caowenbo2311694605的博客 249

POJ-2195 Going Home(最小费用最大流)

Going Home Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 21918   Accepted: 11087 Description On a grid map there are n little men and n houses. In each unit time, ever...

十分残念的博客 517

POJ_2195_Going Home_最小费用最大流

Going Home Time Limit: 1000MS        Memory Limit: 65536K Total Submissions: 20807        Accepted: 10543 Description On a grid map there are n little men and n houses. In each unit time, every

持之以恒_fighting 886
上一篇: POJ Power Network 1459(最大流)
下一篇: POJ Kaka's Matrix Travels 3422 (最小费用最大流)
K_y
K_y
博客等级 码龄10年 4粉丝 74原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值