【问题标题】:Check if Graph is a Directed Graph?检查图是否是有向图?
【发布时间】:2021-07-24 01:26:23
【问题描述】:

对于下面的函数,我尝试编写一个方法来测试图的矩阵表示是否是有向图。它应该至少包含一条边,但没有对应的边。

//G- Graph
//N - Nodes
bool isDigraph(bool G[N][N]) {
for (int rows = 0; rows < N; rows++)
    for (int columns = 0; columns < N; columns++)
        if (rows != columns && G[rows][columns] == 1)
            return false; // returns false if is not a directed graph
return true; // return true if it is a directed graph
}

这里的目标是显示图形是有向的。如果图形为空且具有自循环,我想确保函数返回 false。

  • 虽然我没有收到错误,但问题是当我的图表为空且有自循环时,它总是返回 true。
  • 有什么我应该添加到我的代码中的吗?有没有办法表明它至少包含一条边但不包含相应的边? 如果有什么我应该添加到我的问题中以使其清楚,请告诉我。

【问题讨论】:

  • 您的意思是G[rows][columns] 在您的if 中吗?
  • @StephenNewell 是的,我的意思是使用 G[rows][columns]
  • @fabian 我确实提到当图表为空且具有自循环时,我的函数每次使用时都会返回 true

标签: c++ algorithm graph


【解决方案1】:

要检查一个图是否在给定邻接矩阵的情况下是有向的,您可以查找关于主对角线的任何不对称性(即,找到 ij 对,其中 G[i][j] != G[j][i])或沿主对角线,表示某个节点的自环。

bool is_digraph(int N, bool **G) {
    for (int row = 0; row < N; row++) {
        for (int col = row; col < N; col++) {
            if (row == col && G[row][col] || G[row][col] != G[col][row]) {
                return true;
            }
        }
    }
    
    return false;
}

所以,像这样的图表

    0 1 2
  +------
0 | 0 0 0
1 | 0 0 0
2 | 0 0 1

是定向的,因为我们有一个自循环。

类似的图表

    0 1 2
  +------
0 | 0 1 0
1 | 1 0 1
2 | 0 1 0

是无向的,因为我们没有自环和关于对角线的对称性。图表如下:

0 
|
1---2

最后,像这样的图表

    0 1 2
  +------
0 | 0 0 0
1 | 1 0 1
2 | 0 1 0

是有向的,因为我们有一个不对称:

0<----1<----2
      |     ^
      |     |
      +-----+

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    • 2021-07-28
    • 1970-01-01
    • 2012-12-04
    • 1970-01-01
    • 1970-01-01
    • 2022-11-13
    相关资源
    最近更新 更多