我如何编写伪代码以在邻接矩阵中找到接收器?

时间:2013-11-19 22:18:54

标签: algorithm graph-theory pseudocode

就像伪代码甚至看起来一样?我知道什么是水槽,并认为我可以告诉你这个过程确定一个。但是,我如何表示矩阵及其行和列?感谢。

1 个答案:

答案 0 :(得分:0)

在Java中,您可以声明一个2d的布尔值矩阵,如下所示:

final int ROWS = 8;
final int COLS = 8;
boolean matrix[][] = new boolean[ROWS][COLS];

然后用一些数据填充矩阵:

for (int i=0; i < ROWS; i++)
   for (int j=0; j < COLS; j++)
      matrix[i][j] = true; //(false if no edge from element i to element j)

然后你可以使用与填充它相同的嵌套for循环结构迭代矩阵:

for (int i=0; i < ROWS; i++)
   for (int j=0; j < COLS; j++)
      //matrix[i][j] is row i, column j

n行和m列的任何矩阵中一直迭代的运行时间为 O(nm)

对于您,因为您正在构建邻接矩阵,ROWSCOLS将是相同的值,因此您只需使用ROWS两次。外部循环遍历每一行,而内部循环遍历每一列,因此它将检查从节点0到节点0,节点1,节点2,节点3等的边缘。

然后它将检查从节点1到节点0,节点1,节点2等的边缘。(注意我们如何以这种方式检查边缘)

因为ROWS和COLS的值相同,所以您的运行时间实际上是 O(n 2

使用更保守的表示图表的方法可以做得更好。

编辑:

您寻找接收器的伪代码可能类似于以下内容:

  • 创建一个将索引与布尔值和计数相关联的列表。索引是矩阵的元素,布尔值是一个标志,用于指示节点是否可以是接收器,计数是传入边缘的数量。
  • 迭代邻接列表,假设matrix [i] [j] == true表示存在从i到j的有向边
  • 如果matrix [i] [j] == true,则元素i不是接收器,因为它具有传出边缘,因此将其布尔值设置为false
  • 如果matrix [i] [j] == true,则将传入边数增加到元素j
  • 在我们遍历矩阵一次之后,我们列表中的某些元素可能仍然认为它可能是一个接收器(即它没有传出边缘),所以我们再次遍历列表以查看这些元素是否具有布尔值仍设置为true的边数等于元素数(即所有其他节点的传入边)

我已经向您展示了如何创建和迭代邻接列表,现在您认为您可以查找如何满足第一个项目符号列表的要求吗?