Hdu1350 Taxi Cab Scheme 【最小路径覆盖】

news2025/1/12 10:38:38

Taxi Cab Scheme

题意

有一张边长不超过 200 200 200 的网格图,有若干个乘客,
乘客 i i i 的需求是: h h : m m , ( a , b ) , ( c , d ) hh:mm, (a,b) , (c, d) hh:mm,(a,b),(c,d),意为他需要在 h h 时 m m 分 hh时mm分 hhmm(或更早)从点 ( a , b ) (a,b) (a,b) 出发,终点为 ( c , d ) (c,d) (c,d)
图上两点的距离就是 曼哈顿距离

现在我们需要使用一些出租车来满足这些乘客的需求,问最少需要几台车?

一台车必须在当前要接送的顾客要求的时间更早到达起点(起码 1 m i n 1min 1min),才能接送成功

思路

最优的情况是只用一台车,那么这台车每次接完当前顾客,它都需要从这个顾客的终点移动到下一个顾客的起点,并且最终到达的时间必须比下一个顾客的要求时间早

那么我们不妨先预处理一下每个乘客的结束时间,存储一下起始时间,并将所有时间转换成 分钟制,便于比较

如果送完了当前顾客 i i i,还能接送下一个顾客 j j j,那么我们可以连边: i → j i \rarr j ij,表示这个传递关系

那么我们 O ( n 2 ) O(n^2) O(n2) 连完边后,从结果出发,如果我们选择了若干辆出租车,每辆出租车按一条路径这样搜索下去,直到不能搜素为止,最终每一个点都被访问了一次

可以发现:关键就是怎么选取这个起始点?也就是选择哪些点作为第一批送走的顾客

我们再进一步想:如果我们选择的集合里面,有两个点,其中一个点可以被另一个点搜索到,也就是说这个点是多余的,那么这个点可以删去
那么我们可以得出结论:最终选择的点集,一定是两两不可达的,等价于集合内没有边
等价于集合是独立集

我们可以在这张二分图上跑最大匹配,那么最终残余网络上,右点还有容量的点就是起点,左点还有容量的点就是终点,由于已经跑出了最大流量,所以残余网络不会变得更小,因此这个起点集就是最小

2

部分思路参考自:最小路径覆盖详解 超级详细

#include<bits/stdc++.h>
#define fore(i,l,r)	for(int i=(int)(l);i<(int)(r);++i)
#define fi first
#define se second
#define endl '\n'
#define ull unsigned long long
#define ALL(v) v.begin(), v.end()
#define Debug(x, ed) std::cerr << #x << " = " << x << ed;

const int INF=0x3f3f3f3f;
const long long INFLL=1e18;

typedef long long ll;

std::vector<std::vector<int>> g;
std::vector<int> match;
std::vector<bool> used;

bool dfs(int u){
    for(auto v : g[u])
        if(!used[v]){
            used[v] = true;
            if(match[v] == -1 || dfs(match[v])){
                match[v] = u;
                return true;
            }
        }
    return false;
}

int main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);
    int t;
    std::cin >> t;
    while(t--){
        int n;
        std::cin >> n;
        g.assign(n, std::vector<int>());
        match.assign(n, -1);

        std::vector<std::pair<int, int>> p(n); //source pos
        std::vector<std::pair<int, int>> pe(n); //end pos
        std::vector<std::pair<int, int>> time(n); //beg, end
        fore(i, 0, n){
            std::string s;
            std::cin >> s >> p[i].fi >> p[i].se;
            int x, y;
            std::cin >> x >> y;
            pe[i] = {x, y};
            int dis = std::abs(p[i].fi - x) + std::abs(p[i].se - y);
            int t0 = atoi(s.substr(0, 2).c_str()) * 60 + atoi(s.substr(3).c_str());
            time[i] = {t0, t0 + dis};
        } 

        fore(i, 0, n)
            fore(j, i + 1, n){
                auto [x1, y1] = pe[i];
                auto [x2, y2] = p[j];
                int dis = std::abs(x1 - x2) + std::abs(y1 - y2);
                if(time[i].se + dis < time[j].fi){
                    g[i].push_back(j);
                }
            }

        int cnt = 0;
        fore(i, 0, n){
            used.assign(n, false);
            cnt += dfs(i);
        }

        std::cout << n - cnt << endl;
    }
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1618597.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Kibana安装部署(Linux)

Kibana是Elasticsearch的开源可视化工具&#xff0c;与存储在Elasticsearch中的数据进行交互。 1. 下载软件 这里使用的Elasticsearch的版本是7.12.0&#xff0c;所以kibana选择同样的7.12.0版本。 官网下载地址&#xff1a;https://www.elastic.co/cn/downloads/past-releas…

安装zabbix server

目录 1、实验环境 2、yum 安装zabbix server 2.1 解决权限问题和放行流量 2.2 安装zabbix-server 1、实验环境 操作系统rhel8zabbix6.0TLS数据库mysql8.0.30IP地址192.168.81.131时间配置NTP时间服务器同步 2、yum 安装zabbix server 如果通过yum源安装&#xff0c;操作系…

【NUCLEO-G071RB】005——RCC-PLL时钟配置

NUCLEO-G071RB&#xff1a;005——RCC-PLL时钟配置 设计目标芯片配置程序修改仿真测试 设计目标 将HSI通过PLL倍频到64MHz&#xff0c;并作为系统时钟。 芯片配置 切换到Clock Configuration选项卡&#xff0c;以图形化界面配置时钟。System Clock Mux是CPU核心的时钟源选择…

AJAX——事件循环(EventLoop)

1.事件循环&#xff08;EventLoop&#xff09; 概念&#xff1a;JavaScript有一个基于事件循环的并发模型&#xff0c;事件循环负责执行代码、收集和处理事件以及执行队列中的子任务。这个模型与其它语言中的模型截然不同&#xff0c;比如C和Java。 原因&#xff1a;JavaScri…

Positive证书——最经济的数字信任的桥梁

简介 在网络世界中&#xff0c;数据安全与隐私保护的重要性日益凸显&#xff0c;其中SSL或TLS证书扮演着至关重要的角色。Positive SSL证书作为全球认可的数字证书品牌之一&#xff0c;以其高性价比和广泛兼容性赢得了广大用户的青睐。 这是一种由权威CA&#xff08;Certifica…

SD-WAN制造业网络优化方案

制造业在数字化浪潮的推动下&#xff0c;进行转型的需求越来越强烈。网络作为制造业数字化转型的关键基础设施&#xff0c;其稳定性、安全性和灵活性直接影响着企业的运营效率和市场竞争力。而SD-WAN可以为制造业提供有效的解决方案&#xff0c;让制造业顺利高效地进行数字化转…

跨模态、多模态、多任务之间的区别与联系

文章目录 1、定义1.1 跨模态1.2 多模态1.3 多任务 2、区别3、联系4、关系图5、总结 1、定义 1.1 跨模态 跨模态是指从一种模态的数据中学习&#xff0c;并将其知识应用到另一种模态的数据上。跨模态学习可以利用不同模态数据之间的隐含关系&#xff0c;从而提高模型的泛化能力…

go语言并发实战——日志收集系统(七) etcd的介绍与简单使用

什么是etcd etcd是基于Go语言开发的一个开源且高可用的分布式key-value存储系统&#xff0c;我们可以在上面实现配置共享与服务的注册与发现。 和它比较相似的还有我们之间所提到的Zookeeper以及consul.(注:后面我们学习微服务的时候etcd和consul会有广泛的使用) etcd有以下几…

napi —— linux 网卡驱动收包机制

linux 操作系统一般指 linux 内核。在 linux 上开发应用的时候&#xff0c;可以使用 linux 提供的系统调用。linux 内核管理着机器上的硬件资源&#xff1a;内存&#xff0c;磁盘&#xff0c;网卡等。开发应用的时候不能直接操作这些硬件&#xff0c;而只能通过系统调用来使用…

力扣HOT100 - 2. 两数相加

解题思路&#xff1a; 缺位的节点进行补零处理&#xff0c;如97323补充为973023 注意相加的进位问题 class Solution {public ListNode addTwoNumbers(ListNode l1, ListNode l2) {ListNode head null, tail null;int carry 0;while (l1 ! null || l2 ! null) {int n1 l…

Go语言并发赋值的安全性

struct并发赋值 type Test struct {X intY int }func main() {var g Testfor i : 0; i < 1000000; i {var wg sync.WaitGroup// 协程 1wg.Add(1)go func() {defer wg.Done()g Test{1, 2}}()// 协程 2wg.Add(1)go func() {defer wg.Done()g Test{3, 4}}()wg.Wait()// 赋值…

Photoshop 2024 25.4蓝猫版_支持参数滤波器和Ai神经滤镜

网盘下载 Photoshop 2024 (Beta) 蓝猫版v25.4.0(2426)全新功能&#xff1a;支持参数滤波器和AI神经滤镜。 最新的PS 25.4 Beta版新增了参数滤波器&#xff08;Parametric Filters&#xff09;功能&#xff0c;而正式版的PS 2024还没有这个功能&#xff0c;只有Beta版才有&…

基础SQL DQL语句

基础查询 select * from 表名; 查询所有字段 create table emp(id int comment 编号,workno varchar(10) comment 工号,name varchar(10) comment 姓名,gender char(1) comment 性别,age tinyint unsigned comment 年龄,idcard char(18) comment 身份证号,worka…

JRT1.5发布演示

JRT1.5演示视频 这是一次思想的解放&#xff0c;这是一次自我的挑战&#xff0c;这是一次涅槃重生。信创、安可、Linux、麒麟、UOS、King、PGSQL、ARM、Java围绕在我周围。JRT在DotNetCore的基础上完成了重生。对我而言&#xff0c;它不仅仅是一套框架那么简单&#xff1b;它更…

【MySQL】InnoDB存储引擎实现事务的原理及MVCC-实现原理

redo log 实现了事务的持久性 如果没有redo log&#xff0c;可能出现脏页现象&#xff0c;导致从缓冲池中更改后加载到硬盘的过程中出现脏页&#xff0c;无法保证持久性。 redo log会记录内存结构中缓冲区中的增删改变化&#xff0c;即时出现脏页&#xff0c;redo log把变化加…

使用keil uv5打开工程显示Device not include in Legacy Device Database怎么解决?

使用keil uv5打开工程显示Device not include in Legacy Device Database怎么解决&#xff1f; 案例&#xff1a;我从gigadevice下载了GD32F303的开发资料&#xff0c;解压后想打开里面的案例。 然后提示 开始我想到的是支持库没有装&#xff0c;就下载了&#xff1a;GigaDe…

Kotlin语法入门-访问和属性修饰符(5)

Kotlin语法入门-访问和属性修饰符(5) 文章目录 Kotlin语法入门-访问和属性修饰符(5)五、访问和属性修饰符1、kotlin修饰符2、internal3、默认修饰符4、open关键字开启继承并实现 五、访问和属性修饰符 1、kotlin修饰符 kotlin在常见的访问修饰符private&#xff0c;protected…

为什么代码签名证书都是“硬证书”?如何选择代码签名证书?

代码签名证书是一种给软件应用程序数字签名的数字证书&#xff0c;它可以确保软件代码的完整性和来源的可信性。代码签名证书可以分为OV代码签名证书和EV代码签名证书&#xff0c;自OV代码签名证书也升级为“硬证书”之后&#xff0c;代码签名证书全部采用“硬证书”。那么&…

Linux--内核移植(二)移植流程及驱动修改

本文来总结一下如何将 NXP 官方提供的 Linux 内核移植到正点原子的 I.MX6U-ALPHA 开发板上。 一、官方开发板内核测试 NXP 提供的 Linux 源码肯定是可以在自己的 I.MX6ULL EVK 开发板上运行下去的&#xff0c;所以我们肯定是以 I.MX6ULL EVK 开发板为参考&#xff0…

信息打点--公众号服务

微信公众号 获取微信公众号的途径https://weixin.sogou.com/ 微信公众号没有第三方服务 Github监控 人员&域名&邮箱 eg&#xff1a;xxx.cn password in:file https://gitee.com/ https://github.com/ https://www.huzhan.com/ 资源搜索 in:name test 仓库标题搜索含有…