利用至少K个节点和给定起始节点的贪婪方法在有向图中寻找路径

时间:2010-10-28 10:14:59

标签: perl algorithm unix graph

我有一个非加权DAG图。我想要做的就是找到 所有路径都是贪婪的,路径应至少包含K个节点, 和一个给定的起始节点。

是否有任何现有的算法/实施方法可以做到这一点?

例如,我有以下图表:

my %graph =(36=>[31],31=>[30,22],30=>[20],22=>[20,8],20=>[1],8=>[5],5=>[2],2=>[1,20]);

alt text

因此,如果我定义K = 5并开始节点36,我希望得到:

{1,20,22,31,36}
{1,20,2,5,8,22,31,36}
{1,20,30,31,36}
{1,2,5,8,22,31,36}

1 个答案:

答案 0 :(得分:1)

这不是很难。

use warnings;
use strict;
use Data::Dumper;

my @stack = ();

my %graph = (36=>[31],31=>[30,22],30=>[20],22=>[20,8],
             20=>[1],8=>[5],5=>[2],2=>[1,20]);

# add begin to stack
push(@stack, { node => 36, way => [36] });

while (@stack > 0) {

    my $node = pop(@stack);

    # way
    my $way = $node->{way};

    # complete way
    if ($node->{node} == 1) {
        print Dumper($node->{way});
    }

    # add next nodes
    my $nextArr = $graph{$node->{node}};

    for my $nextNod (@$nextArr) {
        # add way
        my @tmpWay = @$way;
        push(@tmpWay, $nextNod);

        # add to stack
        push(@stack, { node => $nextNod, way => \@tmpWay });
    }
}

因此,您可以测试,如果节点结束节点并保存所有路径(方式)。 你必须优化这个脚本

修改

添加无限的保存保护。

编辑2

您不需要无尽的保护。添加shift到pop,然后搜索多种方式结束音符:)