繁体   English   中英

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

[英]Algorithm for finding distinct paths from A to B in weighted, directed, cyclic graph

假设我们有一个DIRECTEDWEIGHTEDCYCLIC图表。

假设我们只对总重量小于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)

  1. 没有。 如果所有输出边都具有权重> W,则路径为零

  2. 否则没有。 路径是由和(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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM