热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

雨中避雨问题(HDU2389)——Hopcroft-Karp算法应用

题目描述:给定n把雨伞和m个人,t分钟后开始下雨。求在每个人只能使用一把雨伞的情况下,最多有多少人可以拿到雨伞。
题目描述

在一个场景中,有 n 把雨伞和 m 个人,t 分钟后开始下雨。每个人只能使用一把雨伞,且每把雨伞只能被一个人使用。目标是在下雨时,尽可能多的人能够拿到雨伞。

解题思路

该问题可以通过二分图的最大匹配来解决。具体步骤如下:

  1. 将问题建模为一个二分图,其中一边是雨伞,另一边是人。
  2. 计算每个人到每把雨伞的距离,如果某人在 t 分钟内可以到达某把雨伞,则在这两个节点之间建立一条边。
  3. 使用 Hopcroft-Karp 算法求解二分图的最大匹配。
代码实现
#include 
#include
#include
#include
#include
#define EDGE(int _to, int _next)
#define to(_to), next(_next)
#define ll long long
using namespace std;
typedef pair P;
const int maxn = 6050; // 存储的点最多是 n + m
int vis[maxn];
struct EDGE {
int to, next;
EDGE() {}
EDGE(int _to, int _next) : to(_to), next(_next) {}
} e[maxn * 1500];
int cnt, n, m, p, ca = 0, T, t;
int head[maxn], con[maxn], dep[maxn];
int x[maxn], y[maxn], s[maxn];
void add(int bg, int to) {
e[++cnt] = EDGE(to, head[bg]);
head[bg] = cnt;
}
void init() {
cnt = 0;
memset(head, -1, sizeof head);
memset(vis, 0, sizeof vis);
memset(con, -1, sizeof con); // 初始化 con 为 -1
cin >> t >> n;
for (int i = 1; i <= n; ++i) scanf("%d%d%d", &x[i], &y[i], &s[i]);
cin >> m;
for (int i = 1; i <= m; ++i) scanf("%d%d", &x[i + n], &y[i + n]);
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j) {
int w = (x[i] - x[j + n]) * (x[i] - x[j + n]) + (y[i] - y[j + n]) * (y[i] - y[j + n]);
int temp = t * s[i] * t * s[i];
if (temp >= w) add(i, j + n);
}
}
bool bfs() {
memset(dep, 0, sizeof dep);
queue q;
while (q.size()) q.pop();
for (int i = 1; i <= n; ++i)
if (con[i] == -1) q.push(i);
bool flag = 0;
while (q.size()) {
int u = q.front();
q.pop();
for (int i = head[u]; i != -1; i = e[i].next) {
if (!dep[e[i].to]) {
dep[e[i].to] = dep[u] + 1;
if (con[e[i].to] == -1) flag = 1;
else dep[con[e[i].to]] = dep[e[i].to] + 1, q.push(con[e[i].to]);
}
}
}
return flag;
}
bool dfs(int u) {
for (int i = head[u]; i != -1; i = e[i].next) {
int v = e[i].to;
if (dep[v] != dep[u] + 1) continue;
dep[v] = 0;
if (con[v] == -1 || dfs(con[v])) {
con[u] = v;
con[v] = u;
return 1;
}
}
return 0;
}
void sol() {
int ans = 0;
while (bfs())
for (int i = 1; i <= n; ++i)
if (con[i] == -1 && dfs(i)) ans++;
printf("Scenario #%d:\n%d\n\n", ++ca, ans);
}
int main() {
cin >> T;
while (T--) {
init();
sol();
}
}

推荐阅读
  • 题目Link题目学习link1题目学习link2题目学习link3%%%受益匪浅!-----&# ... [详细]
  • 本题探讨如何通过最大流算法解决农场排水系统的设计问题。题目要求计算从水源点到汇合点的最大水流速率,使用经典的EK(Edmonds-Karp)和Dinic算法进行求解。 ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • Codeforces Round #566 (Div. 2) A~F个人题解
    Dashboard-CodeforcesRound#566(Div.2)-CodeforcesA.FillingShapes题意:给你一个的表格,你 ... [详细]
  • 本文深入探讨了POJ2762问题,旨在通过强连通分量缩点和单向连通性的判断方法,解决有向图中任意两点之间的可达性问题。文章详细介绍了算法原理、实现步骤,并附带完整的代码示例。 ... [详细]
  • 本题涉及一棵由N个节点组成的树(共有N-1条边),初始时所有节点均为白色。题目要求处理两种操作:一是改变某个节点的颜色(从白变黑或从黑变白);二是查询从根节点到指定节点路径上的第一个黑色节点,若无则输出-1。 ... [详细]
  • 本题旨在通过给定的评级信息,利用拓扑排序和并查集算法来确定全球 Tetris 高手排行榜。题目要求判断是否可以根据提供的信息生成一个明确的排名表,或者是否存在冲突或信息不足的情况。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本文探讨了 C++ 中普通数组和标准库类型 vector 的初始化方法。普通数组具有固定长度,而 vector 是一种可扩展的容器,允许动态调整大小。文章详细介绍了不同初始化方式及其应用场景,并提供了代码示例以加深理解。 ... [详细]
  • 本次考试于2016年10月25日上午7:50至11:15举行,主要涉及数学专题,特别是斐波那契数列的性质及其在编程中的应用。本文将详细解析考试中的题目,并提供解题思路和代码实现。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • C++: 实现基于类的四面体体积计算
    本文介绍如何使用C++编程语言,通过定义类和方法来计算由四个三维坐标点构成的四面体体积。文中详细解释了四面体体积的数学公式,并提供了两种不同的实现方式。 ... [详细]
  • 本文介绍了在Windows环境下使用pydoc工具的方法,并详细解释了如何通过命令行和浏览器查看Python内置函数的文档。此外,还提供了关于raw_input和open函数的具体用法和功能说明。 ... [详细]
author-avatar
重庆车管所
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有