You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mathematica 11中无向图边取反(补图)实现方法问询

在Mathematica 11中生成无向图的补图(边取反)

你说得没错,Mathematica的ReverseGraph确实只负责反转有向边的方向,完全帮不上无向图边取反的忙。不过要实现你要的效果——移除原有边、给原本无边的节点对建立连接——其实就是生成原图的补图,这里有两种简单可行的方法:

方法一:利用完全图和边差集

这个思路最直观:先生成对应节点的完全图(包含所有可能的无向边),再减去原图已有的边,剩下的就是补图的边。

举个例子,假设你的无向图是g,代码如下:

# 先获取原图的所有节点
nodes = VertexList[g];
# 生成对应节点的无向完全图
completeGraph = CompleteGraph[nodes, DirectedEdges -> False];
# 用完全图的边减去原图的边,得到补图的边集
complementEdges = EdgeDifference[EdgeList[completeGraph], EdgeList[g]];
# 构造补图
complementGraph = Graph[nodes, complementEdges, DirectedEdges -> False]

这个方法会自动保留原图的所有节点(包括孤立节点),而且完美符合你的需求:原本有边的节点对现在没边,原本没边的现在连上了。

方法二:通过邻接矩阵操作

如果你的图节点较多,或者习惯用矩阵处理,邻接矩阵的方式会更高效。补图的邻接矩阵等于「全1矩阵(对角线为0,避免自环)」减去原图的邻接矩阵:

# 获取原图的邻接矩阵
originalAdj = AdjacencyMatrix[g];
nodeCount = Length[VertexList[g]];
# 生成全1矩阵,对角线设为0(无自环)
fullAdjMatrix = ConstantArray[1, {nodeCount, nodeCount}] - IdentityMatrix[nodeCount];
# 计算补图的邻接矩阵
complementAdj = fullAdjMatrix - originalAdj;
# 从邻接矩阵转成无向图
complementGraph = Graph[complementAdj, VertexLabels -> "Name", DirectedEdges -> False]

这种方法的好处是可以灵活调整,比如如果你的原图包含自环,只需要去掉- IdentityMatrix[nodeCount]这部分即可。

注意事项

  • 一定要指定DirectedEdges -> False,确保生成的是无向图,避免默认生成有向边的情况。
  • 两种方法都会完整保留原图的节点集合,孤立节点的处理完全符合你的需求:原图中孤立的节点(和所有其他节点都没边),在补图里会和所有其他节点建立连接;反之,如果原图中某个节点和部分节点有边,补图里就只和剩下的节点相连。

内容的提问来源于stack exchange,提问作者Reacher234

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:56:30