C++ 无向图中的路径搜索
我试图列出一个无向图中的所有路径,我的问题类似于。我试过运行,但它无限循环--我用60个节点运行它。关于如何产生正确的解决方案有什么想法吗 我添加了这样一个随机图,代码如下:C++ 无向图中的路径搜索,c++,C++,我试图列出一个无向图中的所有路径,我的问题类似于。我试过运行,但它无限循环--我用60个节点运行它。关于如何产生正确的解决方案有什么想法吗 我添加了这样一个随机图,代码如下: #include<stdio.h> static struct { int value1; int value2; int used; } data[] = { { 1, 2 }, { 1, 5 }, { 2, 3 }, { 2, 6 }, { 3, 7 }, {
#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);
}`
#包括
静态结构{
int值1;
int值2;
使用int;
}数据[]={
{ 1, 2 },
{ 1, 5 },
{ 2, 3 },
{ 2, 6 },
{ 3, 7 },
{ 4, 0 },
{ 0, 4 },
{ 7, 3 },
{ 2, 1 },
};
枚举{DATA_SIZE=sizeof DATA/sizeof*DATA};
静态整数输出[数据大小];
int遍历(int-from、int-to、int-depth){
输出[depth++]=from;
int i;
如果(从==到){
对于(i=0;i
输出为:
1-2-3-7
1-2-3-7
1-2-3-7
1-2-3-7
为什么我要走这条路4次?有可能修复吗?谢谢您无法修复它。图中的路径数(不包括稀疏图)本身是指数型的,只有输出才会花费永远的时间。显然,这是不可能的。即使您的图形是稀疏的(但是连接的),也至少会有O(N^2)条路径。据我所知,您链接到的算法会多次访问同一个顶点(但不会多次访问同一条边)。这意味着一条路径的最大长度与图形中的边数成正比,而不是与节点数成正比。你说你的图有60个节点-有多少条边?如果这个数字非常大,那么它可能会运行很长时间,甚至产生一条路径
您可以稍微修改算法,只访问每个节点一次,但这可能不是您想要的。嗯,不完全是这样,这取决于图形的形状。。“但对于大多数图,您所说的都是正确的。”KarolyHorvath补充说,这种说法对于稀疏图是不正确的。但是作者并没有指定他的图,你是在试图找到图中所有节点之间的所有路径还是两个给定节点之间的所有可能路径?对于以后,检查简单的Python实现,这是微不足道的转换为C++。它在更小的图上工作,比如说4个节点?还是10个节点?根据图形的连接方式,最多可以查看1.1/5百万条路径。如果你能计算出每秒10亿条路径,那么执行起来需要877年。关于你的问题约束的更多信息会更好。提示:谷歌“动态规划”我试图获得两个节点之间的所有路径。你有两次边(1,2)和(3,7),这使得4条路径看起来相同。我有另一个例子,有20个节点和50条边。我如何修改它才能工作?如果您访问每个节点一次,将无法获得所有路径。