Source code for networkx.algorithms.approximation.vertex_cover
"""用于计算近似最小权重顶点覆盖的函数。
*顶点覆盖* 是节点的一个子集,使得图中的每条边都至少与该子集中的一个节点相连。
.. _顶点覆盖: https://en.wikipedia.org/wiki/Vertex_cover
.. |顶点覆盖| replace:: *顶点覆盖*
"""
import networkx as nx
__all__ = ["min_weighted_vertex_cover"]
[docs]
@nx._dispatchable(node_attrs="weight")
def min_weighted_vertex_cover(G, weight=None):
r"""返回一个近似的最小加权顶点覆盖。
此函数返回的节点集合保证是一个顶点覆盖,并且该集合的总权重保证不超过最小权重顶点覆盖的总权重的两倍。换句话说,
.. math::
w(S) \leq 2 * w(S^*),
其中 $S$ 是此函数返回的顶点覆盖,$S^*$ 是图中所有顶点覆盖中权重最小的顶点覆盖,$w$ 是计算给定集合中每个节点权重和的函数。
Parameters
----------
G : NetworkX 图
weight : 字符串, 可选 (默认 = None)
如果为 None,则每个节点的权重为 1。如果为字符串,则使用此节点属性作为节点权重。没有此属性的节点被假定权重为 1。
Returns
-------
min_weighted_cover : 集合
返回一个节点集合,其权重和不超过最小权重顶点覆盖的权重和的两倍。
Notes
-----
对于有向图,顶点覆盖的定义相同:一个节点集合,使得图中的每条边至少与集合中的一个节点相邻。无论该节点是有向边的头部还是尾部,都被忽略。
这是用于计算近似顶点覆盖的局部比率算法。该算法贪婪地减少边上的成本,迭代地构建覆盖。此实现的最坏情况运行时间为 $O(m \log n)$,其中 $n$ 是节点数,$m$ 是图中的边数。
References
----------
.. [1] Bar-Yehuda, R., and Even, S. (1985). "A local-ratio theorem for approximating the weighted vertex cover problem."
*Annals of Discrete Mathematics*, 25, 27–46
<http://www.cs.technion.ac.il/~reuven/PDF/vc_lr.pdf>
"""
cost = dict(G.nodes(data=weight, default=1))
# While there are uncovered edges, choose an uncovered and update
# the cost of the remaining edges.
cover = set()
for u, v in G.edges():
if u in cover or v in cover:
continue
if cost[u] <= cost[v]:
cover.add(u)
cost[v] -= cost[u]
else:
cover.add(v)
cost[u] -= cost[v]
return cover