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
相关产品推荐
相关产品推荐

