在加权定向循环图中寻找从A到B的不同路径的算法

时间:2012-01-17 10:56:58

标签: algorithm graph graph-algorithm path-finding

假设我们有一个 DIRECTED 加权 CYCLIC 图表。

假设我们只对总重量小于MAX_WEIGHT的路径感兴趣

在两个节点A和B之间找到总重量小于MAX_WEIGHT的不同路径的最合适(或任何)算法是什么?

P.S:这不是我的功课。只是个人的非商业项目。

3 个答案:

答案 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)

  1. 没有。如果所有输出边缘具有权重> 0,则路径为零; w ^

  2. 否则没有。路径是由和(noe(C1,W-W1),noe(C2,W-W2),... noe(Cn,W-Wn))得到的路径数之和,其中C1 ... Cn是连接到N的节点,W-Wi不是负数,其中Wi是连接边的权重,用您最喜欢的语言写成。

  3. 根据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。