POJ 2195 Going Home 最小费用流

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

Going Home
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 23975 Accepted: 12034

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

[Submit]   [Go Back]   [Status]   [Discuss]



题意:给出一个图,m代表人,h代表房子,一间房子只能住一个人,格子之间距离都为1,问所有人走到房子最短距离是多少;


思路:可以把距离看成费用,这题就是最小费用流问题,房子代表汇点,人代表源点;


建图:点与点之间建边,费用为1,容量无限;

            超级源点s连向m,容量1,费用0;

            h连向超级汇点t,容量1,费用0;

            反向边费用相反;


AC code:

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <string>
#include <queue>
#include <vector>
#include <stack>
#include <iostream>
#include <algorithm>

using namespace std;

const int MAXN = 20000+50;
const int MAXE = MAXN*4;
const int INF = 0x3f3f3f3f;

struct node {
    int u,v,w;
    int cap,next;
} edge[MAXE] ;

int pre[MAXN];
int Head[MAXN];
int Dis[MAXN];
bool vis[MAXN];
int n,m,top;

void Init(){
    memset(Head,-1,sizeof(Head));
    top=0;
}

void AddEdge(int u,int v,int w,int cap) {
    edge[top].u=u;  edge[top].v=v;
    edge[top].w=w;  edge[top].cap=cap;
    edge[top].next=Head[u];
    Head[u] = top++;

    edge[top].u=v;  edge[top].v=u;
    edge[top].w=-w; edge[top].cap=0;
    edge[top].next=Head[v];
    Head[v]=top++;
}

int SPFA(int s,int t) {
    stack<int> Q;
    memset(Dis,INF,sizeof Dis);
    memset(vis,false,sizeof vis);
    memset(pre,-1,sizeof pre);
    Dis[s] = 0 ; vis[s]=true;
    Q.push(s);
    while(!Q.empty()) {
        int u = Q.top(); Q.pop();
        for(int i = Head[u]; i!=-1; i = edge[i].next) {
            int v = edge[i].v;
            if(edge[i].cap && Dis[v]>Dis[u]+edge[i].w) {
                Dis[v] = Dis[u]+edge[i].w;
                pre[v]=i;
                if(!vis[v]) {
                    vis[v]=true;
                    Q.push(v);
                }
            }
        }
        vis[u] = false;
    }
    if(Dis[t]==INF) return 0;
    else return 1;
}

int MCF(int s,int t){
    int MinFlow,MinCost=0;
    while(SPFA(s,t)){

        MinFlow=INF;
        for(int k=pre[t];k!=-1;k=pre[edge[k].u]){
            MinFlow=min(MinFlow,edge[k].cap);
        }
        for(int k=pre[t];k!=-1;k=pre[edge[k].u]){
            edge[k].cap-=MinFlow;
            edge[k^1].cap+=MinFlow;
        }
        MinCost+=Dis[t]*MinFlow;
    }
    return MinCost;
}

int getIndex(int i,int j){
    return i*m+j;
}

int ok(int i,int j){
    if(i>=0&&i<n&&j>=0&&j<m) return 1;
    else return 0;
}

char map[200][200];
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};

int main() {
    while(~scanf("%d%d",&n,&m)){
        if(n==0&&m==0) break;
        for(int i=0;i<n;i++){
            scanf("%s",&map[i]);
        }

        int s=n*m+1,t=n*m+2;
        Init();

        for(int i=0;i<n;i++){
            //printf("%s\n",map[i]);
            for(int j=0;j<m;j++){
                if(map[i][j]=='m') AddEdge(s,getIndex(i,j),0,1);
                else if(map[i][j]=='H') AddEdge(getIndex(i,j),t,0,1);
                for(int k=0;k<4;k++){
                    int x=i+dx[k];
                    int y=j+dy[k];
                    if(ok(x,y)) AddEdge(getIndex(i,j),getIndex(x,y),1,INF);
                }
            }
        }

        int ans=MCF(s,t);
        printf("%d\n",ans );
    }
    return 0;
}



VUE3如何使得大屏自适应的几种方法? 16:9。 阅读详情

相关推荐

Cisco Packet Tracer 7.3免登录技巧:3种方法快速跳过注册界面(附详细截图)

本文针对Cisco Packet Tracer 7.3启动时遇到的登录界面问题,提供了三种合法高效的解决方案。详细介绍了如何利用官方访客模式快速启动、注册思科账号实现一劳永逸登录,以及通过调整本地安装配置优化启动流程,帮助网络学习者与备考者绕过繁琐步骤,快速进入实验环境。

weixin_29305337的博客 741

POJ 2195 Going Home(解题报告)

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 ma

CSUST_ACM的专栏 643

Harness设计——Anthropic实战:规划器、生成器、评估器三角色协作详解

本文探讨了如何通过多智能体架构突破AI编码的瓶颈问题。文章首先分析了当前AI编码面临的两大核心挑战:上下文窗口限制导致的连贯性丧失,以及自我评估机制缺失引发的质量判断偏差。针对这些问题,作者提出了基于生成对抗网络(GAN)灵感的解决方案,设计了三智能体系统:规划器负责需求分析,生成器执行编码任务,评估器进行质量审查。 实验表明,在前端设计任务中,通过制定可量化的评分标准(设计质量、原创性、工艺、功能性)并建立生成-评估反馈循环,能显著提升输出质量。这种架构随后被扩展到全栈开发领域,采用类似敏捷开发的&quo

oe1019的专栏 869

poj 2195 Going Home(KM||费用流)

http://poj.org/problem?id=2195 题目大意: 给定一个N*M的地图,地图上有一定数量的m(代表人)和H(代表房子),两者数量相等; 要求求出把所有m移动到H的位置上总距离最小为多少; 思路: 用最优二分匹配或者最小费用最大流都能做,觉得用最优二分匹配会简单一些; 建图把m和H分别作为二分图的两个顶点集合vx和vy,求出两两之间的距离,用k

cha1_cool的专栏 529

STM32实战:用定时器触发ADC+DMA双缓冲实现电机电流采样(附避坑指南)

本文详细介绍了如何利用STM32的定时器触发ADC注入组采样,结合DMA双缓冲机制实现电机电流的高效采样。通过PWM触发和双缓冲架构,解决了开关噪声干扰、实时性要求和数据一致性等核心挑战,显著降低CPU负载并提升采样精度。附有完整的代码示例和避坑指南,适用于无人机电调、工业伺服驱动器等高精度电机控制场景。

weixin_33737134的博客 520

TSP:车为什么能和云端交互?

TSP:车为什么能和云端交互?

天赐好车的博客 414

poj 2195 Going Home(最小费用流)

题目链接:http://poj.org/problem?id=2195 题目大意是给一张网格,网格中m代表人,h代表房子,网格中的房子和人数量相等,人可以向上向下走,每走1步花费加1,每个房子只能住一个人,问使得所有人住房子里最少的花费是多少? 最小费用流的题目,最大流跑spfa,每个人和每个房子之间建边,边的流量为1,花费是人到房子的距离,假定一个源点和一个汇点,源点连接所有的人,每条边流量...

qq_41949535的博客 228

AgentScope 实战训练营-构建元规划智能体(Meta Planner Agent)—— 从 0 到 1 完整实现

本文介绍了基于AgentScope框架开发的元规划智能体(Meta Planner Agent)系统。该系统通过任务拆解和子代理编排机制,实现复杂任务的自动化处理。核心架构分为用户层、规划器层和子代理层,其中规划器作为"项目经理"负责任务分解、创建子代理并协调执行流程。关键技术包括AgentScope多智能体框架、DashScope大语言模型、PlanNotebook计划管理工具等。

program哲学 360

POJ 2195 Going Home 最小费用流

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

weixin_30553065的博客 112

windows exe爬虫:exe抓包

在不知情所拦截应用使用的流量时,所以建议用Wireshark。本文利用python代码,实现自动拦截,写入pcap包,并用代码分析流量的协议。这样会在本地目录下生成capture_inbound.pcap,可以用wireshark分析,也可以利用python代码进行分析,如果使用python代码进行分析,需要借助pyshark或者scapy。使用的python WinDivert的包,当然前提也是需要安装Wireshark软件,设置环境变量,并安装pydirvert包。

youbingchen的博客 617

如何卸载Gazebo与重装

gazebo是一款关于车辆和无人机的仿真软件,本文大致介绍它是何物,以及他的安装和卸载方法,对于ROS开发者,本文有一定参考意义。

gongdiwudu的专栏 1万+

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

https://cn.vjudge.net/contest/68128#problem/D 还是跟着kuangbin专题练一下建图技巧 这道题很裸的费用流题,建图思路也是非常容易想到 设有tot个房子和tot个人 0和tot*2+1为源点和汇点,1-tot为人的编号,tot+1-tot*2为房子编号 把每个人和每个房子连起来,然后把每个人和源点连起来,房子和汇点连起来,并把每条边的流量设...

STOP 187

华为OD技术面真题 - JAVA开发 - 1

汇总华为OD技术面八股JAVA八股,高频技术真题并提供详细解答。

qq_45776114的博客 1203

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

题目连接:http://poj.org/problem?id=2195 题目大意 :题目的意思就是给你一个map然后m代表人,h代表house,一个人只能进入一个house,一个house只能住一个人,问你所以人进入house所能用的最小步数是多少~ 思路:把man和house分别看做一个集合,这样的话你就可以对每个人和每个house 连接,cao = 1,cost = abs(x1-x2)+...

weixin_30258027的博客 120

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

POJ 2195Going Home(网络流之最小费用流)

题目地址:POJ2195 本人职业生涯费用流第一发!!快邀请赛了,决定还是多学点东西,起码碰到简单的网络流要A掉。以后最大流费用流最小割就一块刷。 以前费用流在我心目中一直是高大上,高不可攀的形象,可这两天才发现,原来费用流就是一个spfa再加点东西。。。一直以为费用流会比最大流的isap要麻烦好多,毕竟多了一个费用的元素。。。。我真的错了。。仔细研究了一下,只用一个spfa确实就可以解决了。

scf0920 1100

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

poj2195Going Home最小费用流

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

dreambyday 355

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

PLFM_RADAR:开源相控阵雷达框架与毫米波教学实践

相控阵雷达是现代雷达系统的核心架构,其原理涉及电磁波辐射、波束形成与信号调制等基础概念。PLFM(锁相频率调制)作为一种面向资源受限平台的FMCW替代方案,通过离散频点跳变降低ADC采样率与FPGA处理压力,显著提升嵌入式雷达系统的实时性与可调试性。该技术在10.5 GHz毫米波频段展现出紧凑天线尺寸与良好穿透性的平衡,广泛应用于高校雷达原理教学、SAR/ISAR实验验证及工业微振动监测等场景。结合Zynq SoC硬件实现与全链路开源设计,PLFM_RADAR为工程教育和原型开发提供了高透明度、可修改、可复

aofan9566的博客 361

POJ2195 Going Home 最小费用流

算出每一个到每一个房子的距离后建图。 源点与人连,容量1,费用0 人与每个房子都要连,容量1,费用为距离 每个房子与汇点连,容量1,费用0 求一次最小费用即可 另外此题数据的范围开大点。 Going Home Time Limit: 1000MS   Memory Limit: 65536K Total Submissions

661

poj2195 going home最小费用流

/*     题目描述:题目给出一张n*m的地图,图中 . 表示空格,m表示人,H表示房间,人和房间的数量相同,人每移动一格的长度是1,现要求每个人进到     一间房中,使房间和人一一对应起来,问所有人最小的移动距离是多少。          方法:先用迪杰斯特拉预处理出每个人到每间房的距离;             再利用最小费用流,总共分四列:             第一列是源

jijijix的博客 378

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

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

Going Home POJ - 2195(最小费用流) 题目链接 题目大意:给定一个N*M的地图,地图上有若干个man和house,且man与house的数量一致。man每移动一格需花费1(即单位费用=单位距离),一间house只能入住一个man。现在要求所有的man都入住house,求最小费用。 样例: 2 2 .m H. 5 5 HH..m ….. ….. ….. m...

deerly_的博客 500

POJ 2195 Going Home (网络流之最小费用流)

Going Home Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 23603   Accepted: 11885 Description On a grid map there are n little men and n houses. In each

Sizaif's 小屋 1761

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

题意:n*m的地图有人和房子,要让每个人进入一个房子(每个房子只能进入一个人,人可以走任何地方(可以经过房子也可以多 人在一个位置,每个人走一步花费1美元,求最小的花费。 思路:最小费用流模板,建好图。。抄模板就行了,这个图比较好建。 原点0~(1~k)房子~(k+1~k+kk)人~(k+kk+1)结点 #include&lt;stdio.h&gt; #include&lt;string...

liuliu2333的博客 239

poj 2195 Going Home 最小费用流

http://poj.org/problem?id=2195 题意:m表示人,H表示房子,一个人只能进一个房子,一个房子也只能进去一个人,房子数等于人数,现在要让所有人进入房子,求所有人都进房子最短的路径。 题解:费用流。取超级源点s=0,超级汇点t=N;s与人建边,房子与t建边,这些边费用为0容量为1;然后人与房子建边,容量为1费用为距离。 代码: #include &lt;iostr...

编程路漫漫 187

POJ2195_Going home(最小费用流)

原题地址:点击打开链接 建立源点s,汇点t,s与每个人之间建边,费用为0,容量为1,每个房子与t建边,费用为0容量为1,每个人与每个房子之间建边,费用为人到达房子的距离,容量为1, 则该题转化为求最小费用流问题。 #include #include #include #include #define MAX 1<<31-1 #define min(x,y)(x<y?x:y) using na

z956281507的博客 932
上一篇: POJ 3159 Candies 差分约束-SPFA栈实现
下一篇: HDU1074:Doing Homework-状态压缩DP
GDUFE_SSS
博客等级 码龄9年 1粉丝 60原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值