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

基于邻接矩阵的补图实现方法与伪代码补全求教

邻接矩阵存储的图的补图实现方案

首先明确补图和邻接矩阵的对应规则:对于n个顶点的图,除顶点与自身的连接(自环)外,原图邻接矩阵中为0的位置在补图矩阵中为1,原图为1的位置补图为0。如果是允许自环的场景,无需排除i==j的位置,直接全量取反即可。

核心实现逻辑

  • 有向图:遍历所有i≠j的矩阵位置,直接对原图取值取反
  • 无向图:邻接矩阵天然对称,仅需遍历上三角区域计算后对称赋值,可减少一半计算量
  • 不需要额外使用队列或者标记数组,直接操作矩阵元素即可,你之前开篇写的队列和Arr数组其实是BFS遍历用的,补图计算不需要这套逻辑

补全后的伪代码

通用版(支持有向/无向图)

// 输入:图G的邻接矩阵adj,顶点总数n
// 输出:补图的邻接矩阵comp_adj
Complement(G, n)
    // 初始化n阶补图邻接矩阵
    int comp_adj[1...n][1...n]
    for i = 1 to n
        for j = 1 to n
            // 无自环需求时保留该判断,有自环需求删除即可
            if i == j
                comp_adj[i][j] = 0
            else
                comp_adj[i][j] = 1 - G.adj[i][j]
    return comp_adj

无向图优化版

// 输入:无向图G的邻接矩阵adj,顶点总数n
// 输出:补图的邻接矩阵comp_adj
ComplementUndirected(G, n)
    int comp_adj[1...n][1...n]
    for i = 1 to n
        comp_adj[i][i] = 0
        // 仅遍历上三角区域
        for j = i + 1 to n
            comp_adj[i][j] = 1 - G.adj[i][j]
            comp_adj[j][i] = comp_adj[i][j]
    return comp_adj

代码落地注意事项

  • 若你的邻接矩阵存储的是边权重而非0/1的边存在标识,需要先将原图矩阵转换为0/1的存在性矩阵后再执行取反操作
  • 若不需要保留原图数据,可以直接在原图邻接矩阵上修改,无需申请额外的矩阵存储空间,遍历i≠j的位置执行G.adj[i][j] = 1 - G.adj[i][j]即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 05:21:00