我正在尝试列出无向图中的所有路径,我的问题类似于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次?有可能解决?感谢
答案 0 :(得分:3)
你无法解决它。图中的路径数(不包括稀疏图)本身是指数级的,只有输出才会永远。显然,这是不可能的。即使您的图表稀疏(但已连接),也至少会有O(N ^ 2)个路径。
答案 1 :(得分:0)
据我了解你链接的算法,它会多次访问同一个顶点(但不会多次访问同一个边缘)。这意味着一条路径的最大长度与图形中 edge 的数量成正比,而不是节点数。你说你的图有60个节点 - 有多少边?如果该数字非常大,那么它可能会在非常长时间内运行,甚至可以生成单个路径。
您可以稍微修改算法,只访问每个节点一次,但这可能不是您要查找的内容。