Algorithm 如何在图中找到精确长度的路径
我想在无向图中找到固定长度的路径(在运行程序时给出)。我正在使用图形的邻接矩阵。Algorithm 如何在图中找到精确长度的路径,algorithm,graph-algorithm,path-finding,Algorithm,Graph Algorithm,Path Finding,我想在无向图中找到固定长度的路径(在运行程序时给出)。我正在使用图形的邻接矩阵。 我尝试使用一些算法,如DFS或A*,但它们只返回最短路径 无法再次访问节点 假设我的图有9个节点,最短路径由4个节点组成。 我想要一个额外的变量,它将“告诉”算法我想要找到有7个节点的路径(例如),它将返回包含在我期望的路径{1,2,4,5,6,7,8}中的节点。 当然,如果没有我想要的路径的解决方案,它将不返回任何内容(或者它将返回接近我的表达式的路径,比如说19而不是20) 有人告诉过我DFS的回溯功能,但我对
我尝试使用一些算法,如DFS或A*,但它们只返回最短路径 无法再次访问节点 假设我的图有9个节点,最短路径由4个节点组成。
我想要一个额外的变量,它将“告诉”算法我想要找到有7个节点的路径(例如),它将返回包含在我期望的路径{1,2,4,5,6,7,8}中的节点。
当然,如果没有我想要的路径的解决方案,它将不返回任何内容(或者它将返回接近我的表达式的路径,比如说19而不是20) 有人告诉过我DFS的回溯功能,但我对此一无所知。
有人能解释一下如何将DFS与回溯结合使用,或者推荐一些其他算法来解决这个问题吗?尝试找到最长的路径,然后将其切割到所需的长度。最长路径也称为图的直径。通过为每个顶点运行DFS可以找到最长的路径。回溯看起来确实是一个合理的解决方案。其思想是递归地找到所需长度的路径 Psuedo代码:
DFS(depth,v,path):
if (depth == 0 && v is target): //stop clause for successful branch
print path
return
if (depth == 0): //stop clause for non successful branch
return
for each vertex u such that (v,u) is an edge:
path.append(v) //add the current vertex to the path
DFS(depth-1,u,path) //recursively check all paths for of shorter depth
path.removeLast() // clean up environment
上述算法将生成所需深度的所有路径。
使用
DFS(深度,源代码,[])
调用(其中[]
是一个空列表)
注:
- 该算法将生成可能不简单的路径。如果只需要简单路径-还需要维护
集,并在将每个顶点附加到找到的路径时将其添加,在将其从路径中移除时将其移除已访问的
- 如果只想找到一个这样的路径,那么应该从函数返回值(如果找到这样的路径,则返回true),并在返回值为true时中断循环(并返回true)
- 所述问题是NP完全问题。只要给出一个有效的算法,你就能轻松地解决问题
因此,不存在多项式时间解(除非p=NP)。对于详尽的搜索,指数时间解决方案,请检查@amit的答案。单个dfs应该足够:
void dfs(int start, int hops)
{
if(hops == k && start == t)
{
path++;
return;
}
else if(hops >= k)
return;
for(int w = 1; w <= n; w++)
if(routes[start][w])
dfs(w, hops + 1);
}
void dfs(整数开始,整数跃点)
{
if(跃点==k&&start==t)
{
path++;
返回;
}
否则如果(跳数>=k)
返回;
对于(int w=1;w假设你可以在一个图中找到一条长度为d的路径,那么你可以运行这个算法| V |次,找到NP完全的最长路径。因此你可以尝试以下方法-
1) 近似算法
2) 蛮力方法(更适合编程)。使用GPU加速代码
您也可能感兴趣的是-
DAG存在一个线性时间算法。“路径接近我的期望”-这是模糊的。我试图用Java编写您的伪代码,但有点错误,我不知道是什么:其中adj[][]是我的图形邻接矩阵,路径存储在堆栈中。嗯,不能确定,但从第一眼看:(1)为什么要从1迭代到numVertex inclusive,而不是从0迭代到numVertex-1 inclusive?java中的数组是基于0的。(2)在递归调用之后,您似乎错过了VISISTER.pop()
,因此VISISTER
集被填充,但在用尽某个路径后,元素永远不会被取出。(3)对于depth==0&&v不是target
,应该还有另一个stop子句(我在伪代码中也遗漏了这个子句,很快就会编辑),它应该终止这个分支。我有这样的图(现在我正在测试这个图):…当我给出depth 8和start 1 end 9(1,9)时,DFS什么也不显示。它应该写[1,2,3,6,5,4,7,8,9]或[1,4,7,8,5,2,3,6,9]。当我给出深度3和开始1结束2(1,2)时,它会正确写入[1,4,5,2],但当我将深度更改为5-无时,它至少应该给出[1,4,7,8,5,2].我不知道这里出了什么问题:在DFS中,n是节点数,k是我想要的路径长度,t是结束节点,对吗?哦,对不起。我没有意识到你需要实际的路径…这只会给你路径数。:P
path = 0;
dfs(source, k);
cout<<path;