igraph 参考手册

用于使用 igraph C 库

搜索手册

第 14 章 图的环

1. 查找环

1.1. igraph_find_cycle — 在图中查找单个环。

igraph_error_t igraph_find_cycle(const igraph_t *graph,
                                 igraph_vector_int_t *vertices,
                                 igraph_vector_int_t *edges,
                                 igraph_neimode_t mode);

警告

此函数是实验性的,其签名尚未被视为最终签名。我们保留更改函数签名的权利,而无需更改 igraph 的主要版本。使用它需要您自担风险。

如果图中存在环,则此函数返回图的一个环。如果图是无环的,则返回空向量。

参数: 

:

输入图。

vertices:

指向整数向量的指针。如果找到环,其顶点将存储在此处。否则,该向量将为空。

:

指向整数向量的指针。如果找到环,其边将存储在此处。否则,该向量将为空。

模式:

一个常量,用于指定在有向图中如何考虑边的方向。有效的模式为:IGRAPH_OUT,遵循边的方向;IGRAPH_IN,遵循相反的方向;以及 IGRAPH_ALL,忽略边的方向。此参数在无向图中被忽略。

返回值: 

错误代码。

时间复杂度:O(|V|+|E|),其中 |V| 和 |E| 是原始输入图中顶点和边的数量。

另请参阅: 

igraph_is_acyclic() 用于确定图是否无环,而不返回特定环;igraph_simple_cycles() 用于列出图中的所有环。

1.2. igraph_simple_cycles — 查找所有简单环。

igraph_error_t igraph_simple_cycles(
        const igraph_t *graph,
        igraph_vector_int_list_t *vertices,
        igraph_vector_int_list_t *edges,
        igraph_neimode_t mode,
        igraph_integer_t min_cycle_length,
        igraph_integer_t max_cycle_length);

警告

此函数是实验性的,其签名尚未被视为最终签名。我们保留更改函数签名的权利,而无需更改 igraph 的主要版本。使用它需要您自担风险。

此函数使用 Johnson 的环检测算法搜索所有简单环,并将它们存储在提供的向量列表中。简单环是没有重复顶点的环(即闭合路径)。

参考

Johnson DB: Finding all the elementary circuits of a directed graph. SIAM J. Comput. 4(1):77-84. https://doi.org/10.1137/0204007

参数: 

:

要搜索环的图。

vertices:

每个环的顶点 ID 将存储在此处。

:

每个环的边 ID 将存储在此处。

模式:

一个常量,用于指定在有向图中如何考虑边的方向。有效的模式为:IGRAPH_OUT,遵循边的方向;IGRAPH_IN,遵循相反的方向;以及 IGRAPH_ALL,忽略边的方向。此参数在无向图中被忽略。

max_cycle_length:

限制要搜索的环的最小长度。传递一个负值以搜索所有环。

max_cycle_length:

限制要搜索的环的最大长度。传递一个负值以搜索所有环。

另请参阅: 

igraph_simple_cycles_callback() 用于为找到的每个环调用一个函数;igraph_find_cycle() 用于查找单个环;igraph_fundamental_cycles()igraph_minimum_cycle_basis() 用于查找环基,它是图的环结构的紧凑表示。

返回值: 

错误代码。

1.3. igraph_simple_cycles_callback — 查找所有简单环(回调版本)。

igraph_error_t igraph_simple_cycles_callback(
        const igraph_t *graph,
        igraph_neimode_t mode,
        igraph_integer_t min_cycle_length,
        igraph_integer_t max_cycle_length,
        igraph_cycle_handler_t *callback,
        void *arg);

警告

此函数是实验性的,其签名尚未被视为最终签名。我们保留更改函数签名的权利,而无需更改 igraph 的主要版本。使用它需要您自担风险。

此函数使用 Johnson 的环检测算法搜索所有简单环,并为每个环调用一个函数。简单环是没有重复顶点的环(即闭合路径)。

参考

Johnson DB: Finding all the elementary circuits of a directed graph. SIAM J. Comput. 4(1):77-84. https://doi.org/10.1137/0204007 See also: igraph_simple_cycles_callback()

参数: 

:

要搜索的图

模式:

一个常量,用于指定在有向图中如何考虑边的方向。有效的模式为:IGRAPH_OUT,遵循边的方向;IGRAPH_IN,遵循相反的方向;以及 IGRAPH_ALL,忽略边的方向。此参数在无向图中被忽略。

max_cycle_length:

限制要搜索的环的最小长度。传递一个负值以搜索所有环。

max_cycle_length:

限制要搜索的环的最大长度。传递一个负值以搜索所有环。

callback:

为找到的每个环调用的函数。另请参见 igraph_cycle_handler_t

arg:

此参数将传递给 callback

另请参阅: 

igraph_simple_cycles() 用于存储找到的环;igraph_find_cycle() 用于查找单个环;igraph_fundamental_cycles() 和 igraph_minimum_cycle_basis() 用于查找环基,它是图的环结构的紧凑表示。

返回值: 

错误代码。

1.4. igraph_cycle_handler_t — 环处理函数类型。

typedef igraph_error_t igraph_cycle_handler_t(
        const igraph_vector_int_t *vertices,
        const igraph_vector_int_t *edges,
        void *arg);

回调类型,在找到环时由 igraph_simple_cycles_callback() 调用。

参数: 

vertices:

当前环的顶点。不得修改。

:

当前环的边。不得修改。

arg:

传递给 igraph_simple_cycles_callback() 的额外参数

返回值: 

错误代码;IGRAPH_SUCCESS 继续搜索,或 IGRAPH_STOP 停止搜索而不发出错误信号。

1.5. igraph_is_acyclic — 检查图是否无环。

igraph_error_t igraph_is_acyclic(const igraph_t *graph, igraph_bool_t *res);

此函数检查图是否具有任何环。考虑边的方向,即在有向图中,仅搜索有向环。

参数: 

:

输入图。

res:

指向布尔常量的指针,结果存储在此处。

返回值: 

错误代码。

另请参阅: 

igraph_find_cycle() 用于查找表明图不是无环的环;igraph_is_forest() 即使在有向图中也查找无向环。

时间复杂度:O(|V|+|E|),其中 |V| 和 |E| 是原始输入图中顶点和边的数量。

2. 欧拉环和路径

这些函数计算是否存在欧拉路径或环,如果存在,则可以找到它们。

2.1. igraph_is_eulerian — 检查是否存在欧拉路径或环。

igraph_error_t igraph_is_eulerian(const igraph_t *graph, igraph_bool_t *has_path, igraph_bool_t *has_cycle);

欧拉路径精确地遍历图的每条边一次。闭合欧拉路径称为欧拉环。

参数: 

:

图对象。

has_path:

指向布尔值的指针,如果存在欧拉路径,则设置为 true。不得为 NULL

has_cycle:

指向布尔值的指针,如果存在欧拉环,则设置为 true。不得为 NULL

返回值: 

错误代码:IGRAPH_ENOMEM,临时数据内存不足。

时间复杂度:O(|V|+|E|),顶点数加上边数。

2.2. igraph_eulerian_cycle — 查找欧拉环。

igraph_error_t igraph_eulerian_cycle(
        const igraph_t *graph, igraph_vector_int_t *edge_res, igraph_vector_int_t *vertex_res);

查找欧拉环(如果存在)。欧拉环是一条闭合路径,精确地遍历每条边一次。

如果图没有边,则返回零长度环。

此函数使用 Hierholzer 算法。

参数: 

:

图对象。

edge_res:

指向初始化的向量的指针。属于环的边的索引将存储在此处。如果调用者不需要,可以为 NULL

vertex_res:

指向初始化的向量的指针。属于环的顶点的索引将存储在此处。向量中的第一个和最后一个顶点将相同。如果调用者不需要,可以为 NULL

返回值: 

错误代码

IGRAPH_ENOMEM

临时数据内存不足。

IGRAPH_ENOSOL

图没有欧拉环。

时间复杂度:O(|V|+|E|),顶点数加上边数。

2.3. igraph_eulerian_path — 查找欧拉路径。

igraph_error_t igraph_eulerian_path(
        const igraph_t *graph, igraph_vector_int_t *edge_res, igraph_vector_int_t *vertex_res);

查找欧拉路径(如果存在)。欧拉路径精确地遍历每条边一次。

如果图没有边,则返回零长度路径。

此函数使用 Hierholzer 算法。

参数: 

:

图对象。

edge_res:

指向初始化的向量的指针。属于路径的边的索引将存储在此处。如果调用者不需要,可以为 NULL

vertex_res:

指向初始化的向量的指针。属于路径的顶点的索引将存储在此处。如果调用者不需要,可以为 NULL

返回值: 

错误代码

IGRAPH_ENOMEM

临时数据内存不足。

IGRAPH_ENOSOL

图没有欧拉路径。

时间复杂度:O(|V|+|E|),顶点数加上边数。

3. 环基

3.1. igraph_fundamental_cycles — 查找基本环基。

igraph_error_t igraph_fundamental_cycles(const igraph_t *graph,
                                         igraph_vector_int_list_t *result,
                                         igraph_integer_t start_vid,
                                         igraph_integer_t bfs_cutoff,
                                         const igraph_vector_t *weights);

警告

此函数是实验性的,其签名尚未被视为最终签名。我们保留更改函数签名的权利,而无需更改 igraph 的主要版本。使用它需要您自担风险。

此函数计算与图的广度优先搜索树关联的基本环基。

忽略边的方向。支持多重边和自环。

参数: 

:

图对象。

result:

一个初始化的整数向量列表。结果将存储在此处,每个向量包含一个基元素的边 ID。

start_vid:

如果为负数,则返回一个完整的基本环基。如果为顶点 ID,则返回与以该顶点为根的 BFS 树关联的基本环,仅用于包含该顶点的弱连通分量。

bfs_cutoff:

如果为负数,则返回一个完整的环基。否则,仅包括长度小于等于 2*bfs_cutoff + 1 的环。bfs_cutoff 用于在搜索环边时限制 BFS 树的深度。

weights:

当前未使用。

返回值: 

错误代码。

另请参阅: 

时间复杂度:O(|V| + |E|)。

3.2. igraph_minimum_cycle_basis — 计算最小权重环基。

igraph_error_t igraph_minimum_cycle_basis(const igraph_t *graph,
                                          igraph_vector_int_list_t *result,
                                          igraph_integer_t bfs_cutoff,
                                          igraph_bool_t complete,
                                          igraph_bool_t use_cycle_order,
                                          const igraph_vector_t *weights);

警告

此函数是实验性的,其签名尚未被视为最终签名。我们保留更改函数签名的权利,而无需更改 igraph 的主要版本。使用它需要您自担风险。

此函数计算图的最小权重环基。当前,使用了 Horton 算法的修改版本,该版本允许截止。

忽略边的方向。支持多重边和自环。

参考

Horton, J. D. (1987) A polynomial-time algorithm to find the shortest cycle basis of a graph, SIAM Journal on Computing, 16 (2): 358–366. https://doi.org/10.1137%2F0216026

参数: 

:

图对象。

result:

一个初始化的整数向量列表,环基的元素将作为边 ID 的向量存储在此处。

bfs_cutoff:

如果为负数,则返回一个精确的最小环基。否则,只有结果中的那些环才是某个最小环基的一部分,其大小小于等于 2*bfs_cutoff + 1。大于此限制的环可能不是最小的可能大小。bfs_cutoff 用于在计算候选环时限制 BFS 树的深度。指定 bfs_cutoff 可以显着加快计算速度。

complete:

布尔值。仅当给出了 bfs_cutoff 时才使用。如果为 true,则返回完整的基。如果为 false,则仅返回不大于 2*bfs_cutoff + 1 的环。这可以节省计算时间,但是,结果不会跨越整个环空间。

use_cycle_order:

如果为 true,则每个环都以自然顺序返回:边 ID 将沿环按顺序出现。这会带来很小的性能成本。如果为 false,则不保证周期内边 ID 的排序。此参数的存在仅仅是为了控制性能权衡。

weights:

当前未使用。

返回值: 

错误代码。

另请参阅: 

时间复杂度:待定。