【问题标题】:Path finding in an undirected graph无向图中的路径查找
【发布时间】:2013-07-29 20:32:15
【问题描述】:

我试图在无向图中列出所有路径,我的问题类似于this question。我尝试运行this code,但它无限循环——我用60 个节点运行它。关于如何产生正确解决方案的任何想法?

我添加了这样一个随机图,代码现在是这样的:

    #include<stdio.h>

static struct {
  int value1;
  int value2;
  int used;
} data[] = {
  { 1, 2 },
  { 1, 5 },
  { 2, 3 },
  { 2, 6 },
  { 3, 7 },
  { 4, 0 },
  { 0, 4 },
  { 7, 3 },
  { 2, 1 },

};

enum { DATA_SIZE = sizeof data / sizeof *data };

static int output[DATA_SIZE];

int traverse(int from, int to, int depth) {
  output[depth++] = from;

  int i;
  if (from == to) {
    for (i = 0; i < depth; i++) {
      if (i) {
        printf("-");
      }
      printf("%d", output[i]);
    }
    printf("\n");
  } else {
    for (i = 0; i < DATA_SIZE; i++) {
      if (!data[i].used) {
        data[i].used = 1;

        if (from == data[i].value1) {
          traverse(data[i].value2, to, depth);
        } else if (from == data[i].value2) {
          traverse(data[i].value1, to, depth);
        }

        data[i].used = 0;
      }
    }
  }
}

int main() {
  traverse(1, 7, 0);
}`

输出是: 1-2-3-7 1-2-3-7 1-2-3-7 1-2-3-7

为什么我会得到 4 次该路径?有可能修复吗?谢谢

【问题讨论】:

  • 您是要查找图中所有节点之间的所有路径还是两个给定节点之间的所有可能路径?对于后面的内容,请查看python.org/doc/essays/graphs 中提供的简单 Python 实现,将其转换为 C++ 是微不足道的。
  • 它是否适用于较小的图,比如 4 个节点?还是10个节点?根据图表的连接方式,您最多可以查看 1.1 个 quintillion 路径。如果你知道如何计算每秒 10 亿条路径,那将需要 877 年才能执行。有关您的问题约束的更多信息会很好。
  • 提示:谷歌搜索“动态编程”
  • 我正在尝试获取两个节点之间的所有路径。
  • 你有两次边 (1,2) 和 (3,7),这使得 4 条路径看起来相同。

标签: c++


【解决方案1】:

你无法修复它。图中的路径数量(不包括稀疏图)本身就是指数级的,只有输出才会永远。显然,这是不可能的。即使您的图是稀疏的(但已连接),也至少会有 O(N^2) 条路径。

【讨论】:

  • 嗯,不完全是,这取决于图表的形状.. 但对于大多数图表来说,你说的是真的。
  • @KarolyHorvath,补充说此声明不适用于稀疏图。但作者没有指定他的图表
【解决方案2】:

据我了解您链接到的算法,它将多次访问同一个顶点(但它不会多次访问同一边)。这意味着一条路径的最大长度与图中 的数量成正比,而不是与节点的数量成正比。你说你的图有 60 个节点——有多少条边?如果这个数字非常大,那么它可能会运行 非常 很长时间才能生成一条路径。

您可以稍微修改算法以仅访问每个节点一次,但这可能不是您想要的。

【讨论】:

  • 我有另一个例子,有 20 个节点和 50 个边。我怎样才能修改它才能工作?
  • 如果每个节点都访问一次,不会得到所有的路径。
猜你喜欢
  • 1970-01-01
  • 2022-01-21
  • 2012-12-25
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多