【http://noi.openjudge.cn/】4.3算法之图论——1538:Gopher II

@[【http://noi.openjudge.cn/】4.3算法之图论——1538:Gopher II]

题目

查看提交统计提问
总时间限制: 2000ms 内存限制: 65536kB
描述
The gopher family, having averted the canine threat, must face a new predator.

The are n gophers and m gopher holes, each at distinct (x, y) coordinates. A hawk arrives and if a gopher does not reach a hole in s seconds it is vulnerable to being eaten. A hole can save at most one gopher. All the gophers run at the same velocity v. The gopher family needs an escape strategy that minimizes the number of vulnerable gophers.
输入
The input contains several cases. The first line of each case contains four positive integers less than 100: n, m, s, and v. The next n lines give the coordinates of the gophers; the following m lines give the coordinates of the gopher holes. All distances are in metres; all times are in seconds; all velocities are in metres per second.
输出
Output consists of a single line for each case, giving the number of vulnerable gophers.
样例输入
2 2 5 10
1.0 1.0
2.0 2.0
100.0 100.0
20.0 20.0
样例输出
1

翻译

**题目:**地鼠II
描述:
地鼠家族在避免了犬科动物的威胁后,必须面对一个新的捕食者。
有n个地鼠洞和m个地鼠洞,每个洞都位于不同的(x,y)坐标处。一只鹰来了,如果地鼠在s秒内没有到达一个洞,它很容易被吃掉。一个洞最多只能救一只地鼠。所有的地鼠都以相同的速度奔跑。地鼠家族需要一种逃生策略,以尽量减少易受攻击的地鼠数量。
输入:
输入包含几个案例。每种情况的第一行包含四个小于100的正整数:n、m、s和v。接下来的n行给出地鼠的坐标;以下m线给出了地鼠洞的坐标。所有距离均以米为单位;所有时间均以秒为单位;所有速度均以米每秒为单位。
输出:
输出由每种情况的单行组成,给出了易受攻击的地鼠数量。
例如:
在语言模型中,编码器和解码器都是由一个个的 Transformer 组件拼接在一起形成的。

代码

#include <bits/stdc++.h>
using namespace std;
struct point {double x, y;int id,oid;vector<point*> h;point() { x = 0; y = 0;oid=0;}//成员要初始化,否则会"runtime error" point(int idx, double px, double py) : id(idx), oid(0), x(px), y(py) {}
}one[210];
bool k[210];
int n, m, s, v,ans;
double x, y;
void view(int x,point* p){cout<<x<<endl;cout<<"坐标"<<p->x<<","<<p->y<<endl; cout<<"可达目标:\n";for(vector<point*>::iterator i=p->h.begin();i!=p->h.end();i++)cout<<"("<<(*i)->x<<","<<(*i)->y<<")\t";cout<<"选中"<<p->oid<<endl;
}
void view(){for(int i=n+1;i<=n+m;i++){cout<<i<<"坐标"<<one[i].x<<","<<one[i].y<<"\t"<<"达"<<one[i].oid<<endl;	} cout<<endl;
}
bool go(point *p){//该老鼠能否找到洞__匈牙利算法,进行二分图匹配 for(vector<point*>::iterator i=p->h.begin();i!=p->h.end();i++){//该老鼠能达的洞 if(k[(*i)->id])continue;//该洞已经用过了 k[(*i)->id]=1;//标记该洞,此老鼠不能再用该洞了 if(!(*i)->oid||go(&one[(*i)->oid])){//该洞没用过或者该洞本来的老鼠可以找到别的洞 (*i)->oid=p->id;//该洞被该老鼠占用 return 1;}}return 0;
} 
int main() {//freopen("data.cpp", "r", stdin);while(cin >> n >> m ){//题目讲The input contains several cases. 有多组数据 ans=0; memset(one, 0, sizeof(one));cin>> s >> v;for (int i = 1; i <=n; i++) {//遍历每个老鼠 cin >> x >> y; one[i] = point(i,x,y);}for (int i = 1; i <=m; i++) {//遍历每个鼠洞 cin >> x >> y; one[n+i] = point(n+i, x,y );for (int j = 1; j <=n; j++) {//遍历每个老鼠 double xg = one[j].x, yg = one[j].y;if ((x - xg)* (x - xg) + (y - yg)* (y - yg) <= (s * v)* (s * v)){//看哪些老鼠可以跑进哪个洞 one[n+i].h.push_back(&one[j]);//该老鼠可以跑到该洞 one[j].h.push_back(&one[n+i]);//该洞成为该老鼠的一个选项 }}	}for (int i = 1; i <=n; i++){//遍历每个老鼠 memset(k,0,sizeof(k));//清空深搜标记 if(go(&one[i]))ans++;//判定该老鼠能否找到洞 //view(i,&one[i]);//view();}//view();cout << n-ans<<endl;	}return 0;
}

细节

  • 题目说有多组数据,The input contains several cases。
  • 结构体内元素一定要初始化,否则会提示runtime error
struct point {double x, y;int id,oid;vector<point*> h;point() { x = 0; y = 0;oid=0;}//成员要初始化,否则会"runtime error" point(int idx, double px, double py) : id(idx), oid(0), x(px), y(py) {}
}one[210];

-在结构体内,每个老鼠可以躲藏的洞可以用指针描述,坚决落实。

deep seek对过程进行的分析:

初始状态
老鼠:
老鼠 1:(0.0, 3.0)
老鼠 2:(0.0, 2.0)
老鼠 3:(0.0, 1.0)
鼠洞:
鼠洞 1:(0.0, 51.0)(未占用)
鼠洞 2:(0.0, 52.0)(未占用)
鼠洞 3:(0.0, 53.0)(未占用)
匹配结果:ans = 0
步骤 1:匹配老鼠 1
老鼠 1尝试匹配:
尝试鼠洞 1:
鼠洞 1 未占用,直接匹配。
匹配成功!
更新状态:
鼠洞 1 被老鼠 1 占用。
ans = 1。
步骤 2:匹配老鼠 2
老鼠 2尝试匹配:
尝试鼠洞 1:
鼠洞 1 已被老鼠 1 占用,无法直接匹配。
递归调用:尝试为老鼠 1 寻找其他鼠洞。
递归过程:
老鼠 1 尝试鼠洞 2:
鼠洞 2 未占用,直接匹配。
匹配成功!
更新状态:
鼠洞 1 被老鼠 2 占用。
鼠洞 2 被老鼠 1 占用。
ans = 2。
步骤 3:匹配老鼠 3
老鼠 3尝试匹配:
尝试鼠洞 1:
鼠洞 1 已被老鼠 2 占用,无法直接匹配。
递归调用:尝试为老鼠 2 寻找其他鼠洞。
递归过程:
老鼠 2 尝试鼠洞 2:
鼠洞 2 已被老鼠 1 占用,无法直接匹配。
递归调用:尝试为老鼠 1 寻找其他鼠洞。
老鼠 1 尝试鼠洞 3:
鼠洞 3 未占用,直接匹配。
匹配成功!
更新状态:
鼠洞 1 被老鼠 3 占用。
鼠洞 2 被老鼠 2 占用。
鼠洞 3 被老鼠 1 占用。
ans = 3。
最终状态
匹配结果:
老鼠 1 → 鼠洞 3
老鼠 2 → 鼠洞 2
老鼠 3 → 鼠洞 1
最终答案:ans = 3

算法

一群老鼠避难,在一堆洞里找藏身处(一洞一老鼠,老鼠只能在规定时间跑到一部分洞里),求最优化,就是更多的老鼠能找到洞。这种两个集合配对问题就是二分图问题。
思路就是找洞,如果该洞被占有了,烦请它去找别的洞(增广路径),找不到就不挪窝,找到了就挪。
这就是最早是由两位匈牙利数学家 Dénes Kőnig 和 Jenő Egerváry 在 20 世纪 30 年代提出的匈牙利算法。

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

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

相关文章

Apache Spark中的依赖关系与任务调度机制解析

Apache Spark中的依赖关系与任务调度机制解析 在Spark的分布式计算框架中,RDD(弹性分布式数据集)的依赖关系是理解任务调度、性能优化及容错机制的关键。宽依赖(Wide Dependency)与窄依赖(Narrow Dependency)作为两种核心依赖类型,直接影响Stage划分、Shuffle操作及容…

【计算机网络】TCP协议相关总结,TCP可靠性的生动讲解

TCP 可靠性 确保快递不丢、不乱、不过载 机制作用&#xff08;快递类比&#xff09;防止的问题检验和检查包裹是否损坏&#xff0c;损坏就重新发数据出错序列号给每个包裹编号&#xff0c;按顺序整理乱序、重复确认应答每送到一件&#xff0c;就让收件人签收丢失滑动窗口控制…

Go基于协程池的延迟任务调度器

原理 通过用一个goroutine以及堆来存储要待调度的延迟任务&#xff0c;当达到调度时间后&#xff0c;将其添加到协程池中去执行。 主要是使用了chan、Mutex、atomic及ants协程池来实现。 用途 主要是用于高并发及大量定时任务要处理的情况&#xff0c;如果使用Go协程来实现每…

杰发科技AC7801——滴答定时器获取时间戳

1. 滴答定时器 杰发科技7801内部有一个滴答定时器&#xff0c;该定时器是M0核自带的&#xff0c;因此可以直接用该定时器来获取时间戳。 同样&#xff0c;7803也可以使用该方式获取时间戳。 2. 滴答定时器原理 SysTick是一个24位的递减计数器&#xff0c;它从预设的重装载值…

湖仓一体概述

湖仓一体之前&#xff0c;数据分析经历了数据库、数据仓库和数据湖分析三个时代。 首先是数据库&#xff0c;它是一个最基础的概念&#xff0c;主要负责联机事务处理&#xff0c;也提供基本的数据分析能力。 随着数据量的增长&#xff0c;出现了数据仓库&#xff0c;它存储的是…

第十五届蓝桥杯单片机组4T模拟赛三(第二套)

本套试题在4T平台中的名字为第15届蓝桥杯单片机组模拟考试三&#xff0c;不知道哪套是4T的模拟赛&#xff0c;所以两套都敲一遍练练手感。 为了代码呈现美观&#xff0c;本文章前面的各个模块在main函数中的处理函数均未添加退出处理&#xff0c;在最后给出的完整代码中体现。 …

CT技术变迁史——CT是如何诞生的?

第一代CT(平移-旋转) X线球管为固定阳极,发射X线为直线笔形束,一个探测器,采用直线和旋转扫描相结合,即直线扫描后,旋转1次,再行直线扫描,旋转180完成一层面扫描,扫描时间3~6分钟。矩阵象素256256或320320。仅用于颅脑检查。 第二代CT (平移-旋转) 与第一代无质…

Virtual Box虚拟机安装苹果Monterey和big sur版本实践

虚拟机安装苹果实践&#xff0c;在Windows10系统&#xff0c;安装Virtual Box7.1.6&#xff0c;安装虚拟苹果Monterey版本Monterey (macOS 12) 。碰到的主要问题是安装光盘不像Windows那么容易拿到&#xff0c;而且根据网上很多文章制作的光盘&#xff0c;在viritualBox里都无法…

dify基础之prompts

摘要&#xff1a;在大型语言模型&#xff08;LLM&#xff09;应用中&#xff0c;Prompt&#xff08;提示词&#xff09;是连接用户意图与模型输出的核心工具。本文从概念、组成、设计原则到实践案例&#xff0c;系统讲解如何通过Prompt解锁LLM的潜能&#xff0c;提升生成内容的…

【学写LibreCAD】0 仿写LibreCAD简介

一、LibreCAD 核心模块&#xff1a; 核心模块&#xff08;Core&#xff09; 功能&#xff1a;处理 CAD 的核心逻辑&#xff0c;如几何计算、图形对象管理、坐标系转换等。关键组件&#xff1a; 图形对象&#xff1a;如直线、圆、圆弧、多段线等。数学工具&#xff1a;向量、矩…

HTML元素,标签到底指的哪块部分?单双标签何时使用?

1. 标签&#xff08;Tag&#xff09; vs 元素&#xff08;Element&#xff09; 标签&#xff08;Tag&#xff09; 标签是 HTML 中用于定义元素的符号&#xff0c;用尖括号 < > 包裹。例如 <img> 是标签。元素&#xff08;Element&#xff09; 元素是由 标签 内容…

Android APK组成编译打包流程详解

Android APK&#xff08;Android Package&#xff09;是 Android 应用的安装包文件&#xff0c;其组成和打包流程涉及多个步骤和文件结构。以下是详细的说明&#xff1a; 一、APK 的组成 APK 是一个 ZIP 格式的压缩包&#xff0c;包含应用运行所需的所有文件。解压后主要包含以…

Token相关设计

文章目录 1. 双Token 机制概述1.1 访问令牌&#xff08;Access Token&#xff09;1.2 刷新令牌&#xff08;Refresh Token&#xff09; 2. 双Token 认证流程3. Spring Boot 具体实现3.1 生成 Token&#xff08;使用 JWT&#xff09;3.2 解析 Token3.3 登录接口&#xff08;返回…

HTTP 请求时传递多部分表单数据

HTTP 请求时传递多部分表单数据&#xff08;multipart/form-data&#xff09; --data-raw $------demo11111\r\nContent-Disposition: form-data; name"Filedata"; filename"截屏2025-02-27 15.45.46.png"\r\nContent-Type: image/png\r\n\r\n\r\n------d…

Java基础关键_013_日期处理

目 录 一、传统 API 1.System.currentTimeMillis() &#xff08;1&#xff09;说明 &#xff08;2&#xff09;实例 2.构造方法 &#xff08;1&#xff09;说明 &#xff08;2&#xff09;无参构造 &#xff08;3&#xff09;有参构造 3.日期格式化 &#xff08;1&am…

51单片机中reg52.h与regx52.h在进行位操作时的不同

reg52.h中不能使用例如 P2_0;这样的定义 而只能使用 P2^0;这样的定义 但是都不可以对位进行直接赋值操作&#xff1b; 而 regx52.h中可以使用 P2_0和P2^0&#xff1b;但是只有使用下划线的才可以对位进行赋值操作 例如P2_0 1; 但不可以是P2^0 1; 在 C 语言中&#xff0c;…

基于Rook的Ceph云原生存储部署与实践指南(上)

#作者&#xff1a;任少近 文章目录 1 Ceph环境准备2 rook部署ceph群集2.1 Rook 帮助地址2.2 安装ceph2.3 获取csi镜像2.4 Master参加到osd2.5 设置默认存储 3 Rook部署云原生RBD块存储3.1 部署storageclass资源3.2 部署WordPress使用RBD3.3 WordPress访问 4 Rook部署云原生RGW…

FastExcel与Reactor响应式编程深度集成技术解析

一、技术融合背景与核心价值 在2025年企业级应用开发中&#xff0c;大规模异步Excel处理与响应式系统架构的结合已成为技术刚需。FastExcel与Reactor的整合方案&#xff0c;通过以下技术协同实现突破性性能&#xff1a; 内存效率革命&#xff1a;FastExcel的流式字节操作与Re…

DeepSeek R1/V3满血版——在线体验与API调用

前言&#xff1a;在人工智能的大模型发展进程中&#xff0c;每一次新模型的亮相都宛如一颗投入湖面的石子&#xff0c;激起层层波澜。如今&#xff0c;DeepSeek R1/V3 满血版强势登场&#xff0c;为大模型应用领域带来了全新的活力与变革。 本文不但介绍在线体验 DeepSeek R1/…

Spring Data JPA 中的分页实现:从 BasePage 到 Pageable

文章目录 Spring Data JPA 中的分页实现&#xff1a;从 BasePage 到 Pageable背景&#xff1a;为什么需要分页&#xff1f;认识 BasePage 类深入 toPageable() 方法1. 处理页码和页面大小2. 处理排序方向3. 处理排序字段4. 生成 Pageable 对象 实战&#xff1a;如何使用 BasePa…