题解 ABC373G【No Cross Matching】/ POJ3565【Ants】

news/2024/9/28 22:15:40

题目描述

年轻的自然主义者比尔在学校里研究蚂蚁。他的蚂蚁以生活在苹果树上的蚜虫为食。每个蚂蚁群需要自己的苹果树来养活自己。比尔有一张地图,上面标有 \(n\) 个蚂蚁群和 \(n\) 棵苹果树的坐标。他知道蚂蚁从它们的蚂蚁群到它们的取食地点,然后返回蚂蚁群,都是使用化学标记的路线。这些路线不能相交,否则蚂蚁会迷失方向,到达错误的蚂蚁群或树,从而引发蚂蚁群之间的战争。比尔希望将每个蚂蚁群连接到单独的苹果树,使得所有的 \(n\) 条路线都是不相交的直线。在这个问题中,这样的连接总是可能的。你的任务是编写一个程序来找到这样的连接。

\(n\leq 300\),坐标范围 \([0, 5000]\),任意三点不共线。

solution

二分图匹配十分困难。有一个极端 \(O(n^4)\) 以上的暴力,直接在平面上建网络流的图,将 \(O(n^4)\) 个交点全部建出来,然后将要连接的一对点用一条链把它们和线上的所有交点全部连起来,并要求交点的流量不超过 \(1\),跑普通的二分图匹配。

考虑一个事情:平面上如果 \(AB\)\(CD\) 有交,我们需要将其调整为 \(AC\)\(BD\)(或 \(AD\)\(BC\))。

o_240928140929_image-20240928220749357.png (1033×643) (cnblogs.com)

我们有四边形不等式:\(AC+BD<AB+CD\)。意思就是,如果现在存在一组匹配,我们可以将其调整使得长度和更小的话,我们直接调整之,必然更加合法。

连出 \(O(n^2)\) 条边,使用你喜欢的算法跑二分图最大权匹配即可。

四边形不等式证明

因为 \(AP+CP>AC\)\(DP+BP>BD\),所以 \(AB+CD>AC+BD\)

code

【模板】网络流的求法 - caijianhong - 博客园 (cnblogs.com) 这里抽取最后一个板子,然后:

int n;
complex<double> a[310], b[310];
int main() {
#ifndef LOCALcin.tie(nullptr)->sync_with_stdio(false);  
#endifcin >> n;for (int i = 1; i <= n; i++) {int x, y;cin >> x >> y;a[i].real(x), a[i].imag(y);}for (int i = 1; i <= n; i++) {int x, y;cin >> x >> y;b[i].real(x), b[i].imag(y);}mcmf_graph<int, double> mf(n * 2 + 2);for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) mf.add(i, n + j, 1, abs(a[i] - b[j]));}for (int i = 1; i <= n; i++) mf.add(0, i, 1, 0);for (int i = 1; i <= n; i++) mf.add(i + n, n * 2 + 1, 1, 0);mf.flow(0, n * 2 + 1);int cnt = 0;for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {if (!mf.g[cnt].w.first) cout << j << " \n"[i == n];cnt += 2;}}return 0;
}

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

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

相关文章

代码随想录算法训练营第三天|203.移除链表元素,707.设计链表,206.反转链表

203.移除链表元素文章链接:https://programmercarl.com/0203.移除链表元素.html#算法公开课 视频讲解:https://www.bilibili.com/video/BV18B4y1s7R9 题目出处:https://leetcode.cn/problems/remove-linked-list-elements/卡哥在这里讲解了为什么要使用虚拟头节点,以及使用…

Android页面跳转与返回机制详解

在Android开发中,页面跳转是实现应用功能交互的重要手段之一。本文将从Activity之间的跳转、Activity与Fragment之间的跳转、Fragment之间的跳转以及页面返回的问题四个方面进行详细解析。 一、Activity之间的跳转 Activity是Android应用的基本构建块,代表了一个用户界面的单…

04-Consul服务注册与发现

1.为什么要引入服务注册中心 1.1 原因 public static final String PAYMENT_SRV_URL = "http://localhost:8001";//硬编码微服务所在的IP地址和端口号硬编码到订单微服务中,会存在非常多的问题 (1)如果订单微服务和支付微服务的IP地址或者端口号发生了变化,则支付…

星际战甲:战甲配卡

题记部分 一、永恒烈焰(火鸡)进图开2,随后4技能升温、3技能降温,钢铁地图炮 二、标题三、标题— 业精于勤荒于嬉,行成于思毁于随 —

结对项目——四则运算

结对项目——四则运算这个作业属于哪个课程 软工22级计科12班这个作业的要求在哪里 作业要求这个作业的目标 实现四则运算的结对编程项目成员姓名 学号 GitHub链接 分工谭立业 3122004365 github 项目功能的基本实现,博客的编写罗锴佳 3122001905 github 功能函数的测试与完善…

引用拷贝,浅拷贝,深拷贝

参考资料 水平有限,欢迎交流! kimi 【【每天一个技术点】引用拷贝、浅拷贝、深拷贝】 一文搞懂Java引用拷贝、浅拷贝、深拷贝 - bigsai - 博客园 (cnblogs.com) 【黑马程序员匠心之作|C++教程从0到1入门编程,学习编程不再难】 1. 引用拷贝 (起绰号) 引用拷贝并不是真正意义上…