1 概述
图同构是一个在图论中非常重要的概念。简单地说,如果两个图在顶点和边的数量上相同,并且可以通过重新标记顶点的方式使一个图变为另一个图,则这两个图是同构的。换句话说,同构的图具有相同的“结构”,只是顶点可能被重新标记或排列。
2 运行环境
操作系统:win10 64位
编程语言:C/C++
编译平台:vs2019 x64 debug | release
igraph版本: 0.10.12
3 示例代码
展示了如何使用igraph库来创建一个有向的外向树(out-tree),然后将其转换为邻接表(adjacency list)表示,接着从该邻接表重新构造图形,并检查这两个图形是否同构(它们应该是同构的)。
igraph_isomorphic
是 igraph
库中的一个函数,该库是一个广泛使用的网络分析库,支持多种编程语言和平台。在 igraph
中,igraph_isomorphic
(或其对应的高级封装函数,例如在 Python 的 igraph
包中)用于判断两个图(graph)是否同构(isomorphic)。
igraph_isomorphic
函数的基本用法是接受两个图作为输入,并返回一个布尔值(或类似的标志),指示这两个图是否同构。
#include <igraph.h> // 引入igraph库的头文件
int main(void) {
// 定义igraph_t类型的变量g和g2,它们将用于存储图形
igraph_t g, g2;
// 定义igraph_adjlist_t类型的变量adjlist,它将用于存储邻接表
igraph_adjlist_t adjlist;
// 定义igraph_bool_t类型的变量iso,用于存储图g和g2是否同构的结果
igraph_bool_t iso;
/*
创建一个具有42个节点、每个节点有3个子节点的有向外向树,并存储在图g中。
这里,IGRAPH_TREE_OUT指定了树的方向是外向的。
*/
igraph_kary_tree(&g, 42, 3, IGRAPH_TREE_OUT);
/*
初始化邻接表adjlist,以存储图g的邻接关系。
IGRAPH_OUT指定我们只关心从每个节点出发的边。
IGRAPH_LOOPS_ONCE允许图中存在自环(每个节点到自身只有一条边)。
IGRAPH_MULTIPLE允许图中存在多重边(两个节点之间可以有多条边)。
*/
igraph_adjlist_init(&g, &adjlist, IGRAPH_OUT, IGRAPH_LOOPS_ONCE, IGRAPH_MULTIPLE);
/*
根据邻接表adjlist创建图g2。
注意,这里并没有使用到“duplicate”参数,因为它被设置为0(默认值),
这意味着如果存在多重边,它们将不会被合并为一个。
*/
igraph_adjlist(&g2, &adjlist, IGRAPH_OUT, /* duplicate = */ 0);
/*
检查图g和图g2是否同构(即它们是否具有相同的结构,只是节点的标签可能不同)。
结果存储在变量iso中。
*/
igraph_isomorphic(&g, &g2, &iso);
// 如果图g和图g2不是同构的
if (iso) {
printf("图g和图g2是同构的。\n");
}
else {
printf("图g和图g2不是同构的。\n");
}
// 销毁邻接表adjlist,释放其占用的内存
igraph_adjlist_destroy(&adjlist);
// 销毁图g2,释放其占用的内存
igraph_destroy(&g2);
// 销毁图g,释放其占用的内存
igraph_destroy(&g);
// 如果一切正常,返回0(表示程序成功结束)
return 0;
}
4 运行结果
当运行该代码时,它应该会正确地创建两个图g
和g2
(它们都是相同的igraph_kary_tree
),然后使用igraph_isomorphic
函数检查它们是否同构,并打印出比较结果。
由于g
和g2
都是基于相同的igraph_kary_tree
函数创建的,并且没有修改它们以改变其结构,因此它们确实是同构的