大图中最大二部匹配的有效技巧
Efficient trick for maximal bipartite matching in bigger graph
问题:给定两个数组A &B的整数。现在在每一步中,我们都可以从这两个数组中取出任意两个非协素数。我们必须找到可以通过这些步骤去除的最大对数。
范围:
5
每个整数<=109
Dinic算法- O(V2E)
Edmonds-karp算法- O(VE2)
Hopcroft-Karp算法O(E sqrt(V))
我到目前为止的方法:这可以建模为具有两个集合A和B的二部匹配问题,并且可以在相应集合中的每个非协素数整数对之间创建边。
但问题是图中可能有O(V2)条边,大多数二部匹配和最大流算法对于如此大的图将会非常慢。
我正在寻找一些具体的问题或数学优化,可以在合理的时间内解决问题。为了通过测试用例,我最多需要O(V log V)或O(V sqrt(V))算法。
你可以尝试做一个顶点图:
- A 中的每个元素
- A 中出现的任意数的质数
- B中的每个元素
- 目的地
添加容量为1的有向边,从源到A中的元素,从B中的元素到目的。
将A中每个元素x的容量为1的有向边相加到x质因数分解中的每个不同素数上。
从每个素数p到B中p除x的每个元素x添加容量为1的有向边
然后求从源到目的的最大流量
这些数字将有少量的因子(最多9个,因为2.3.5.7.11.13.17.19.23.29大于10**9),所以你将在中间最多有180万条边。
这比你之前可能拥有的10,000,000,000条边要少得多(例如,如果A和B中的所有100,000个条目都是偶数),所以也许你的最大流量算法有机会满足时间限制。
相关文章:
- 将二维矢量传递给类
- 二叉排序树无法编译
- 欧拉项目#8答案是大以获得有效答案
- 在计算中使用二的幂有多有利可图
- 调整大小后指向元素值的指针unordered_map有效?
- 为什么是0;C++中的有效语句
- 最高有效数字侧的第N位
- 将值从二维数组输出到文本文件
- GCC对可能有效的代码抛出init list生存期警告
- 有效地使用std::unordered_map来插入或增加键的值
- 有效地从文本文件中读取带有字符串索引的大型二维数组(矩阵)
- 给定的二叉树是有效的BST吗?
- 看似有效的算法,用于在不浪费空间的情况下将二叉搜索树存储在数组中
- 有效选择二叉树节点子节点
- 二部图中的匹配计数
- 当条目以有序的方式添加时,二叉搜索树有效地充当链表
- 图中的二部匹配
- 大图中最大二部匹配的有效技巧
- 判断二叉搜索树的后序是否有效
- 在内存中操作std::string的二维动态数组的最有效方法是什么?