【问题标题】:Generate random graph with probability p生成概率为 p 的随机图
【发布时间】:2022-01-18 02:52:41
【问题描述】:

在main.cpp中写一个函数,创建一个一定大小的随机图如下。该函数有两个参数。第一个参数是顶点数n。第二个参数 p (1 >= p >= 0) 是一对节点之间存在边的概率。特别是,在实例化具有 n 个顶点和 0 条边的图之后,逐一遍历所有可能的顶点对,并为每一对这样的顶点之间放置一条概率为 p 的边。

如何知道两个顶点之间是否存在边。

这是完整的问题

PS:我不需要代码实现

【问题讨论】:

  • 你应该随机决定任意两个顶点之间是否有边(概率p,大概独立)
  • 您在寻找邻接表或矩阵吗?
  • 如何判断边是否存在?你能给我一个函数,它接受两个顶点和概率 p,如果应该有一条边,则返回 true,否则返回 false。
  • @infinitezero 矩阵
  • 嘿@ChandrapalSingh 我以前的算法有偏见。 @user17732522 指出了这一点,我对其进行了修改。请查看我添加到算法部分的else 子句。请阅读答案下的 cmets 来解释问题所在。如果您需要进一步解释,请询问。

标签: algorithm data-structures graph probability


【解决方案1】:

问题陈述清楚地表明第一个输入参数是节点数,第二个参数是p任意2个节点之间存在一条边的概率。

您需要做的如下(更新以修正@user17732522指出的错误):

1- Create a bool matrix (2d nested array) of size n*n initialized with false.
2- Run a loop over the rows:
  - Run an inner loop over the columns:
    - if row_index != col_index do:
        - curr_p = random() // random() returns a number between 0 and 1 inclusive
        - if curr_p <= p: set matrix[row_index][col_index] = true
          else: set matrix[row_index][col_index] = false
          - For an undirected graph, also set matrix[col_index][row_index] = true/false based on curr_p

注意:由于我们在矩阵中设置两个单元格(两个方向)以防概率命中,我们可能会设置边缘 2 次。这不会破坏概率的正确性,也不需要太多额外的工作。它有助于保持代码干净。

如果您想优化此解决方案,您可以运行循环,以便您只访问左下角三角形(不包括对角线),并将这些单元格获得的结果镜像到右上角三角形。 就是这样。

【讨论】:

  • 谢谢。 @user17732522 试图解释我,但你说得很清楚。
  • 不客气,乐于助人:D
  • 这有点不清楚。如果将matrix[x][y]设置为true,但没有同时设置matrix[y][x],则表示节点x连接到节点y,而节点y保持不 i> 连接到x。这意味着您正在构建一个 有向 图。然而,问题陈述中没有定义,所以我宁愿假设图应该是无向的。
  • 谢谢你指出你,@CiaPan 我会相应地修改我的答案
  • 它现在以错误的概率设置边缘。您不应该有两次机会获得任何特定优势。
猜你喜欢
  • 1970-01-01
  • 2014-10-06
  • 1970-01-01
  • 2017-04-10
  • 2017-10-01
  • 2016-01-26
  • 2012-02-11
  • 2016-01-06
相关资源
最近更新 更多