假设我们有一个 DIRECTED ,加权和 CYCLIC 图表。
假设我们只对总重量小于MAX_WEIGHT的路径感兴趣
在两个节点A和B之间找到总重量小于MAX_WEIGHT的不同路径的最合适(或任何)算法是什么?
P.S:这不是我的功课。只是个人的非商业项目。答案 0 :(得分:2)
如果节点数和MAX_WEIGHT
不是太大(并且所有权重都是整数),则可以使用动态编程
unsigned long long int num_of_paths[MAX_WEIGHT+1][num_nodes];
初始化为0,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
的总和。
答案 1 :(得分:1)
简单的递归。你有指数时间。显然,不允许零重量循环。
功能noe(节点N,限制权重W)
没有。如果所有输出边缘具有权重> 0,则路径为零; w ^
否则没有。路径是由和(noe(C1,W-W1),noe(C2,W-W2),... noe(Cn,W-Wn))得到的路径数之和,其中C1 ... Cn是连接到N的节点,W-Wi不是负数,其中Wi是连接边的权重,用您最喜欢的语言写成。
根据Dijkstra的算法,应该存在更有效的解决方案,但我认为这对于家庭作业来说已经足够了。
答案 2 :(得分:0)
您的问题是K-Disjoint Path In directed planar graphs的更一般情况,没有修复K。
定向平面图的 K
不相交路径问题如下:
给定:有向平面图G =(V; E)和k对(r 1 ; s 1 ); ....; G的顶点(r k ; s k );
找到: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。