POJ2195-Going Home(最小费用最大流)

运筹学-图论实例 目录最短路问题Dijkstra算法R语言实现最大流与最小割割集的定义割集的容量最大流-最小割问题求最大流的标号算法最小费用流问题 最短路问题 求连通图任意两点间总权最小的路 Dijkstra算法 对每一个顶点给出一组标号,其中第一位代表从始点到该点最短路权的上界,第二位代表该点的上一个点,第三位是T或P,T表示试探性标号,是一种临时标 号,P表示永久性标号,即这个标号不会改变。标有P的点,其第一位标号即为最短路权。算法的每一步都把某一点的T标号改为P标号,当终点被标上P时,全部计算结束。 以这个图为例,我们 阅读详情

题目链接

http://poj.org/problem?id=2195

题意

一个N * M的地图,由.(空地)和H(房子)和m(人)组成,其中人的数目等于房子的数目,要求将每个人位移到不同的房子里面 ,要求总位移最小

思路

将房子看做点集u,人看做点集v,并且u中的点x到v中的点y有连线,连线的权值为x到y的距离,即转化为求二分图的最佳完美匹配。转化为最小费用最大流
建图方案
房子:点集u
人:点集v
u中的每个点和v中的每个点的连线的费用cost为最短距离,容量cap为1
新建超级源S和超级汇T,其中S连到u中的每个点,v连到T中的每个点。cap = 1, cost = 0
然后跑一遍最小费用最大流即可

代码

#include <iostream>
#include <cstring>
#include <stack>
#include <vector>
#include <set>
#include <map>
#include <cmath>
#include <queue>
#include <sstream>
#include <iomanip>
#include <fstream>
#include <cstdio>
#include <cstdlib>
#include <climits>
#include <deque>
#include <bitset>
#include <algorithm>
using namespace std;

#define PI acos(-1.0)
#define LL long long
#define PII pair<int, int>
#define PLL pair<LL, LL>
#define mp make_pair
#define IN freopen("in.txt", "r", stdin)
#define OUT freopen("out.txt", "wb", stdout)
#define scan(x) scanf("%d", &x)
#define scan2(x, y) scanf("%d%d", &x, &y)
#define scan3(x, y, z) scanf("%d%d%d", &x, &y, &z)
#define sqr(x) (x) * (x)
#define pr(x) cout << #x << " = " << x << endl
#define lc o << 1
#define rc o << 1 | 1
#define pl() cout << endl

const int MAX_MAP_SIZE = 100 + 5;
const int MAXN = 300;
const int INF = 0x3e3e3e3e;

int N, M;
char Map[MAX_MAP_SIZE][MAX_MAP_SIZE];
PII peo[MAX_MAP_SIZE], hou[MAX_MAP_SIZE];

struct Edge {
    int from, to, cap, flow, cost;
};

struct MCMF {
    int s, t, n, m;
    int d[MAXN], p[MAXN], inq[MAXN], a[MAXN];
    vector<int> G[MAXN];
    vector<Edge> edges;

    void init(int n) {
        this->n = n;
        for (int i = 0; i < n; i++) G[i].clear();
        edges.clear();
    }

    void addedge(int from, int to, int cap, int cost) {
        edges.push_back((Edge){from, to, cap, 0, cost});
        edges.push_back((Edge){to, from, 0, 0, -cost});
        m = edges.size();
        G[from].push_back(m - 2);
        G[to].push_back(m - 1);
    }

    bool bellman_ford(int s, int t, int &flow, int &cost) {
        memset(inq, 0, sizeof(inq));
        for (int i = 0; i < n; i++) d[i] = INF;
        d[s] = 0; inq[s] = 1; p[s] = 0; a[s] = INF;
        queue<int> Q;
        Q.push(s);
        while (!Q.empty()) {
            int u = Q.front(); Q.pop();
            inq[u] = 0;
            for (int i = 0; i < G[u].size(); i++) {
                Edge &e = edges[G[u][i]];
                if (e.cap > e.flow && d[e.to] > d[u] + e.cost) {
                    d[e.to] = d[u] + e.cost;
                    p[e.to] = G[u][i];
                    a[e.to] = min(a[u], e.cap - e.flow);
                    if (!inq[e.to]) {
                        Q.push(e.to);
                        inq[e.to] = 1;
                    }
                }
            }
        }
        if (d[t] == INF) return false;
        flow += a[t];
        cost += d[t] * a[t];
        int u = t;
        while (u != s) {
            edges[p[u]].flow += a[t];
            edges[p[u] ^ 1].flow -= a[t];
            u = edges[p[u]].from;
        }
        return true;
    }

    int min_cost(int s, int t) {
        int flow = 0, cost = 0;
        while (bellman_ford(s, t, flow, cost));
        return cost;
    }
};

int main() {
    while (scan2(N, M) && N + M != 0) {
        int hnum = 0, mnum = 0;
        for (int i = 0; i < N; i++) {
            scanf("%s", Map[i]);
            for (int j = 0; j < M; j++) {
                if (Map[i][j] == 'H') hou[hnum++] = mp(i, j);
                if (Map[i][j] == 'm') peo[mnum++] = mp(i, j);
            }
        }

        //house_num: 0 ~ hnum - 1;
        //man_num: hnum ~ 2hnum - 1;
        //s: 2 * hnum, t : 2 * hnum + 1;
        MCMF _M;
        _M.init(2 * hnum + 2);
        int S = 2 * hnum, T = 2 * hnum + 1;
        for (int i = 0; i < hnum; i++) {
            _M.addedge(S, i, 1, 0);
            _M.addedge(i + hnum, T, 1, 0);
            for (int j = 0; j < hnum; j++) {
                int dist = abs(hou[i].first - peo[j].first) + abs(hou[i].second - peo[j].second);
                _M.addedge(i, j + hnum, 1, dist); 
            }
        }

        int ans = _M.min_cost(S, T); 
        printf("%d\n", ans);
    }
    return 0;
}

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

相关推荐

CCS环境下ADC采样波形的实时可视化调试技巧

本文详细介绍了在CCS环境下实现ADC采样波形实时可视化的调试技巧。通过数组缓存优化、多通道同步显示和波形测量工具的高级用法,帮助开发者高效调试嵌入式系统中的ADC采样问题,提升信号分析的准确性和效率。

weixin_33712987的博客 419

R语言基础-1.6排序,平均值、最大值、最小值、和

rm(list = ls()) #生成一个100元素的[-100,100]间的随机数向量,种子为23 set.seed(23) a&lt;-runif(100,-100,100) #求其平均值、最大值、最小值、和 mean(a) max(a) min(a) sum(a) #对其进行排序输出 #函数及参数:sort(x,decreaing=False) 默认decreaing为False #大-&g...

weixin_38560851的博客 2万+

o型圈沟槽设计_O型密封圈——详细选型过程及步骤

一、密封圈常用材料二、密封圈常用密封形式密封圈分为活塞密封,活塞杆密封,端面密封,旋转密封。三、O型密封圈的选型规则O型密封圈的尺寸图径向安装O型圈选型(静态和动态运动)活塞杆密封选择适当规格的O形圈时,应该保证其外径(d1+2*d2)至少等于或者大于沟槽外径d6;当选择的O形圈直径d1大于250 mm时, O形圈外径将不能超过沟槽外径的3%;当选择的O形圈直径d1小于250mm时, O形圈外径将...

weixin_39856630的博客 2万+

最小费用最大流问题与算法实现(Bellman-Ford、SPFA、Dijkstra)

Bellman-Ford、SPFA、改进的Dijkstra三种算法解决最小费用最大流问题以及相关代码的实现。

不积跬步无以至千里 7万+

【QEMU系统分析之TPM篇(一)】

本文以 QEMU 8.2.2 为例,分析其 TPM-emulator 模块的实现,并为 QEMU 添加 Windows 平台的TPM 模拟器的支持。

David唐辉的博客 1191

Python 爬虫实战:网站反爬机制绕过终极指南(技术原理 + 实战代码 + 避坑技巧)

在 Python 爬虫的世界里,反爬机制是每一个爬虫开发者都必须面对的挑战。网站为了保护自身数据不被恶意爬取,会设置各种反爬机制,这使得爬虫开发变得更加复杂和有趣。本文将详细介绍常见的网站反爬机制及其绕过方法,结合技术原理、实战代码和避坑技巧,帮助你成为一名优秀的爬虫开发者。

u014481728的博客 1006

POJ 2195 Going Home 费用流

题目源:https://vjudge.net/problem/POJ-2195               http://poj.org/problem?id=2195 模板源:https://blog.youkuaiyun.com/Adolphrocs/article/details/84558274 题解:费用流 将每个人man与每个屋子house,连一条流量为1,费用为(man和house的距离)...

Adolphrocs的博客 651

强化学习在视觉导航中的应用

强化学习在视觉导航中的应用​ ,人工智能,计算机视觉,大模型,AI,强化学习(Reinforcement Learning, RL)是一种通过智能体(Agent)与环境进行交互,以最大化累积奖励为目标的机器学习范式。它不依赖于预定义的规则或大量标注数据,而是让智能体在试错过程中学习最优策略。计算机视觉(Computer Vision)则赋予智能体 “观察” 环境的能力,使其能够从图像或视频中提取有用信息。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 22万+

POJ-2195(最小费用最大流+MCMF算法)

Going Home POJ-2195 这题使用的是最小费用流的模板。 建模的时候我的方法出现错误,导致出现WA,根据网上的建图方法没错。 这里的建图方法是每次到相邻点的最大容量为INF,而花费为1,因为花费等于距离。但是需要增加一个源点和一个汇点,然后将每个人和源点相连,每个房子和汇点相连,容量都为1,费用都为0. #include<iostream> #include...

291

Python爬虫应对Cloudflare防护:5秒盾+Turnstile验证码实战(AST反混淆+指纹模拟,成功率95%)

Cloudflare 5秒盾+Turnstile验证码的防护核心,是通过“前端JS挑战+多维度指纹校验”确认请求来源的真实性。用AST反混淆还原CF的验证逻辑,避免执行无用代码导致的验证失败;基于真实浏览器采集指纹,确保指纹维度100%匹配真人环境;结合轻量级JS引擎和自动化工具,模拟完整的浏览器执行环境。该方案的绕过成功率可达95%(剩余5%主要是IP或请求频率导致的风控),适用于绝大多数部署CF防护的网站。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1718

AUTOSAR-SOMEIP配置总结

导入arxml之后someip信号一般以“pduSomeIp”开头或者“SomeIp”开头。以某个pdu为例,设置项“Pdu Default Partition Ref”主要是根据模块设计,配置相应的Ecuc核分区。在导入arxml之后someip信号中有三个特殊的信号,形如“SdInstance”开头的信号,设置项“Pdu Default Partition Ref”主要是根据模块设计,配置相应的Ecuc核分区。“EcuC”模块主要关注“EcucPduCollection”中的“Pdus”下面的配置。

xiandang8023的博客 4654

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

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

Ezereal的博客 710

CMM软件:PC-DMIS汽车制造二次开发

PC-DMIS 是一种广泛应用于坐标测量机(CMM)的测量软件,它不仅提供了强大的测量功能,还支持用户通过二次开发来扩展其功能。二次开发可以显著提升测量效率,满足特定的测量需求,减少重复性工作,提高数据处理和分析的准确性。本节将介绍 PC-DMIS 二次开发的基本概念、开发环境的搭建以及开发中常用的工具和方法。PC-DMIS 二次开发为用户提供了强大的工具,可以显著提升测量效率、减少重复性工作并提高数据处理和分析的准确性。

kkchenjj的博客 1815

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

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

lllllan 229

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

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

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

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

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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

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 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

POJ - 2195 Going 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 t...

vocaloid01的博客 232

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

http://poj.org/problem?id=2195 题意:一个n*m的矩阵,其中每个'm'代表一个人,每个‘H'代表一个房子,且人和房子的数目相同,要求每个人找到一个属于自己的房子,每个房子只能住一个人,人到房子的花费就是它们之间的曼哈顿距离。问他们的最小花费。 思路:

2217

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

题意:多组输入,n行m列矩阵包含相等个数的 ‘m’ 和 ‘ H ’ 每个men要到达Home,每移动一个格子耗费 1,求最小花费。 题解:很明显每个人都要到达且移动次数最少,即最小花费最大流。 源点->men->Home->汇点建图 #include <iostream> #include <stdio.h> #include <que...

恒持此志成永志 206

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

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

weixin_30911809的博客 128

poj2195 Going Home 最小费用最大流

题意:给定n*m的矩阵 (最大100*100) .为空地 H为房子 m为人 (题目保证 H的个数 一个房子只能住一个人 问:让每个人回到任意一个房子使得所有人需要步数最少,问最少需要多少步。 思路:费用流,虚拟源点与人建边 费用为0, 一个人与所有房子建边,费用为步数, 房子与汇点建边费用为0 所有边流量限制为1 /*********************************

AC_kereo的专栏 889

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

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

Masamiiiiii 835

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
上一篇: LA3971-Assemble(贪心+二分)
下一篇: POJ2135-Farm Tour(固定流量的最小费用流)
Lzed
博客等级 码龄12年 5粉丝 256原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值