首页 > 其他分享 >题解 ABC373G【No Cross Matching】/ POJ3565【Ants】

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

时间:2024-09-28 22:13:03浏览次数:8  
标签:BD 二分 AC 蚂蚁 No int 题解 POJ3565 苹果树

题目描述

年轻的自然主义者比尔在学校里研究蚂蚁。他的蚂蚁以生活在苹果树上的蚜虫为食。每个蚂蚁群需要自己的苹果树来养活自己。比尔有一张地图,上面标有 \(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 LOCAL
  cin.tie(nullptr)->sync_with_stdio(false);  
#endif
  cin >> 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;
}

标签:BD,二分,AC,蚂蚁,No,int,题解,POJ3565,苹果树
From: https://www.cnblogs.com/caijianhong/p/18438504/solution-ABC373G

相关文章

  • 题解 CF407D【Largest Submatrix 3】/ SS240928C【c】
    题目描述给定一个\(n\timesm\)的正整数矩阵,求其中最大的满足其中不存在两个位置数值相等的子矩阵大小。\(1\leqn,m\leq400\)。本题有多种做法,而你需要寻找常数最小的做法才能通过本题。solution链表+双指针枚举上边界,逐渐下移下边界,枚举左边界,尝试双指针获得右边界......
  • Solution - Kilonova 2837 P2
    先考虑q2。考虑到如果是以\(2^N\)为入手点因为进位的原因看起来就做不了。于是考虑以\(M\)为前缀入手。考虑刻画出\(M\)为前缀的数\(x\)的形式。可以考虑根据\(M\)后面的位数\(k\)来刻画,有\(x\in\bigcup_{k=0}^{\lfloor{\frac{L}{\log_210}}\rfloor}[M\tim......
  • OpenOCD 代码学习(4)其它配置命令
    目录前言1swj_newdap2dapcreate3targetcreate4<target_name>configure5flashbank总结前言1)上一节我们学习了adapter与transport命令,这一节我们接着学习配置文件中的其它命令。本文主要是对配置文件中用到的命令(如下图)进行解析,以在命令行运行如下命令的结果为准:......
  • 题解 ARC118E【Avoid Permutations】/ SS240928D【d】
    题目描述对于一个排列\(a\),定义其权值如下:生成一个\((n+2)\times(n+2)\)的网格图,行列标号为\(0∼n+1\),每次可以从\((i,j)\)走到\((i,j+1)\)或\((i+1,j)\),且不能走到\((i,a_i)\),权值为从\((0,0)\)走到\((n+1,n+1)\)的方案数。现在排列\(......
  • 妙用编辑器:使用Notepad--正则表达式从命令结果报文快速生成新命令
    应用场景日常生活中有些维护场景,比如检查设备状态,执行查询命令后,得到精简结果报文,如果要更深入的检查状态,可能还要执行其他命令,逐个对象进行查询,这里涉及到快速从报文生成查询指令的功能。比如有如下一个从LST命令查询出来的报文,需要快速的生成DSP命令,逐个Subrack进行查询。RE......
  • DAAE2008 Innovative Building Structures
    DAAE2008 Innovative BuildingStructuresSemester2,20241.   IntroductionTheaimoftheunit istoengagestudents instudying innovative and advanced building structures, addressingtopology,materials,andconstruction. Topics include :......
  • 【已解决】arduino一直在进入界面无法打开问题
    问题概述:            启动Arduino时一直卡在启动界面已尝试方法:删除arduino所有文件,重新安装关闭防火墙以管理员身份打开解决方法:打开设置进入更新和安全,选择windows安全中心进入病毒和威胁防护,选择“病毒和威胁防护”设置下拉选择 添加或删除排除项......
  • [USACO22DEC] Making Friends P 题解
    T2[USACO22DEC]MakingFriendsP考虑删除一个点,会有如下的点相连接:题目要求如果两两个点建立联系,只会建立一次。所以,神奇地,我们取出当前待删的点所连接的最小的点,将它和剩下的点连接。手摸一下会发现这样就巧妙地给每个改建的边都建了一次。所以用一个set启发式合并就做完......
  • 2. 两数相加题解
    题目描述给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字0之外,这两个数都不会以0开头。示例1:输入:l1=[2,4,3],l2=[5,6,4......
  • llama-factory挂载pm2出现问题:node: /lib64/libstdc++.so.6: version `CXXABI_1.3.9'
    使用ssh连接服务器上运行llama-factory进行微调,但是一旦关闭ssh,程序也会随之关闭,而使用nohup命令会出现nohup:ignoringinput尝试采用pm2:(base)[hongjiayin@localhostLLaMA-Factory]$pm2startstart.shnode:/lib64/libstdc++.so.6:version`CXXABI_1.3.9'notfound......