algorithm - 二分图中边的均匀分布
问题描述
我得到一个二分有向图,最初没有边。一组节点称为主体,另一组称为对象。边只能从主体到客体构建。分别给出了主体(numSubj
)和客体( )的数量。numObj
此外,还给出了可用边的数量 ( numEdges
)。
目标是将边缘从主体均匀分布到物体。这意味着所有主体都应该有相似数量的出边,类似地所有对象应该有相似数量的入边。每个主体和客体都必须至少有一个连接边。
请提出解决方案(例如在伪代码中)
解决方案
首先,让我们索引每组节点中的所有项目,numSubj
从 1 到 1 到numObj
。让我们也假设numSubj < numObj
(如果这不是真的而不是简单地翻转集合,解决并再次翻转它们)。
现在计算这些数字中的总边数,然后您可以通过将结果除以( )lcm
得出出边数,并通过除以( ) 找到入边数。numObj
A
numSubj
B
在对每个主题进行此计算之后,为计算的主题数量创建一条边,其中进入边的数量 ,A
小于计算的第二个数字 - B
。
这个过程可以这样完成:
i
连接到[i * B, i * B + 1, ... , i * (B + 1) - 1 ] mod numObj
2
和5
:_
LCM = 10
Ingoing = 10 / 5 = 2
Outgoing = 10 / 2 = 5
1 -> 1, 2, 3, 4, 5
2 -> 1, 2, 3, 4, 5
4
和8
:_
LCM = 8
Ingoing = 8 / 8 = 1
Outgoing = 8 / 4 = 2
1 -> 1, 2
2 -> 3, 4
3 -> 5, 6
4 -> 7, 8
4
和6
:_
LCM = 12
Ingoing = 12 / 6 = 2
Outgoing = 12 / 4 = 3
1 -> 1, 2, 3
2 -> 4, 5, 6
3 -> 1, 2, 3
4 -> 4, 5, 6
推荐阅读
- php - 错误 preg_replace 删除所有 div 里面的内容
- dart - 如何从小部件访问上下文
- db2-zos - 生成的列不适用于 z/os,而在 LUW 中可以
- unity3d - Unity 上的 ScrollView 级别菜单
- swift - 导航栏中的后退按钮重叠,快速 4
- c# - 按字符串列值对列表排序为日期时间
- c# - 将列表拆分为 n 个不同的子列表匹配条件,同时保持尽可能接近
- matrix - 如何使用向量<>在邻接矩阵中表示一个大图
- javascript - 如何在更改选项卡(焦点)时暂停递归 setTimeout
- neo4j - Java Neo4j - 没有名为“apoc.refactor.mergeNodes”的过程