![](/img/trans.png)
[英]Find all paths from source to destination in a weighted cyclic directed graph
[英]Algorithm for finding distinct paths from A to B in weighted, directed, cyclic graph
假设我们有一个DIRECTED , WEIGHTED和CYCLIC图表。
假设我们只对总重量小于MAX_WEIGHT的路径感兴趣
找到总重量小于MAX_WEIGHT的两个节点A和B之间的不同路径数量的最合适(或任何)算法是什么?
PS:这不是我的功课。 只是个人的非商业项目。
如果节点数和MAX_WEIGHT
不是太大(并且所有权重都是整数),则可以使用动态编程
unsigned long long int num_of_paths[MAX_WEIGHT+1][num_nodes];
初始化为0,但num_of_paths[0][start] = 1;
除外num_of_paths[0][start] = 1;
。
for(w = 0; w < MAX_WEIGHT; ++w){
for(n = 0; n < num_nodes; ++n){
if (num_of_paths[w][n] > 0){
/* for each child c of node n
* if w + weight(n->c) <= MAX_WEIGHT
* num_of_paths[w+weight(n->c)][c] += num_of_paths[w][n];
*/
}
}
}
解是num_of_paths[w][target], 0 <= w <= MAX_WEIGHT
总和num_of_paths[w][target], 0 <= w <= MAX_WEIGHT
。
简单的递归。 你有指数时间。 显然,不允许零重量循环。
功能noe(节点N,极限重量W)
没有。 如果所有输出边都具有权重> W,则路径为零
否则没有。 路径是由和(noe(C1,W-W1),noe(C2,W-W2),... noe(Cn,W-Wn))得到的路径数之和,其中C1 ... Cn是连接到N的节点,其中W-Wi不是负数,其中Wi是连接边缘的权重,用您喜欢的语言编写。
根据Dijkstra的算法,应该存在更有效的解决方案,但我认为这对于家庭作业来说已经足够了。
你的问题是K-不相交路径的更一般情况在有向平面图中 ,没有固定的K.
定向平面图的K
不相交路径问题如下:
给定 :有向平面图G =(V; E)和k对(r 1 ; s 1 ); ....; (r k ; s k )G的顶点;
find :k成对顶点不相交的有向路径P 1 ; ......; G中的P k ,其中P i从r i到s i (i = 1; ......; k)。
在k-disjoint路径中,您可以从所有s i到B绘制弧,并且通过这种方式从A到所有r i ,从G创建图G'。
现在,如果你能用P中的G'解决你的问题,你就可以解决G中的k-disjoint路径,所以P = NP。
但是,如果你阅读链接的论文,它给出了一般图形的一些想法(用固定的k求解k-不相交路径),你可以用它来得到一些好的近似。
还有更复杂的算法在一般图中解决了P(对于固定k)的这个问题。 但总的来说并不容易(这是西摩)。
因此,您目前最好的选择是使用强力算法。
编辑:因为MAXWEIGHT独立于你的输入大小(你的图形大小)它不会影响这个问题,也因为它是NP-Hard的无向未加权图,你仍然可以简单地得出它的NP-Hard。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.