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

如何用nauty(C版本)生成n阶非同构非二分连通图?求替代算法

生成非二分连通图的实现方案

背景

已知nauty工具的geng命令可生成n顶点二分连通图,命令为:

geng n -c -b

但无直接生成非二分连通图的对应命令。当前通过SageMath过滤实现,代码如下:

s = [g for g in graphs.nauty_geng('-c 6') if g.is_bipartite() == False]
len(s)

执行结果为95。

基于nauty的C版本实现

可以直接调用nauty的C API,生成连通图后过滤二分图:

  1. 调用geng接口生成所有n顶点连通图(对应命令行geng n -c)
  2. 对每个生成的图,用BFS染色法判断是否为二分图:给顶点交替染色,若相邻顶点出现同色则为非二分图;也可检查图是否包含奇环(二分图等价于无环或所有环均为偶环)
  3. 收集并处理所有非二分连通图

核心逻辑示例(C风格):

struct graph g;
int n = 6;
// 初始化生成n顶点连通图
init_geng(n, "-c");

while (next_graph(&g)) {
    if (!is_bipartite(&g)) {
        // 保存或处理该非二分连通图
        process_graph(&g);
    }
}

直接生成非二分连通图的算法

无需先全量生成再过滤,可直接构造:

  • 奇环扩展法:从三角形(3顶点奇环)出发,逐步添加顶点并连接到图中任意顶点,保证连通性的同时,因奇环存在,图始终为非二分图
  • 二分图改造法:先生成连通二分图,再在同一顶点分区内添加一条边(引入奇环),得到非二分连通图;结合nauty的同构检测可避免生成重复图

命令行管道过滤方案

若使用nauty命令行工具,可通过管道结合自定义C脚本过滤:

geng 6 -c | ./filter_non_bipartite

其中filter_non_bipartite为自定义程序,读取geng输出的图数据,判断是否为二分图,仅输出非二分图结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 07:30:15