首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在有向图中找到从源到汇的所有路径?

如何在有向图中找到从源到汇的所有路径?
EN

Stack Overflow用户
提问于 2018-10-21 20:20:55
回答 1查看 217关注 0票数 6

我想找到从源到汇的所有路径。预期:

代码语言:javascript
运行
复制
(3 11 17 24 32 39 45)
(3 11 18 26 33 39 45)
(3 11 18 26 33 40 46)
(3 11 18 26 33 40 47)
(3 11 19 27 33 39 45)
(3 11 19 27 33 40 46)
(3 11 19 27 33 40 47)
(3 11 19 27 34 40 46)
(3 11 19 27 34 40 47)
(6 12 20 27 33 39 45)
(6 12 20 27 33 40 46)
(6 12 20 27 33 40 47)
(6 12 20 27 34 40 46)
(6 12 20 27 34 40 47)

在我的代码中,我知道如何访问每个顶点,但是如何正确地记住和组装完整的路径呢?

代码语言:javascript
运行
复制
use 5.028;
use feature 'signatures';
use strictures;
use Graph qw();

my $g = Graph->new(directed => 1);
for my $edge_tuple (qw(
    3-11 6-12 11-17 11-18 11-19 12-20 17-24 18-26 19-27 20-27 24-32 26-33
    27-33 27-34 32-39 33-39 33-40 34-40 39-45 40-46 40-47
)) {
    my ($from, $to) = split '-', $edge_tuple;
    $g->add_edge($from, $to);
}
say join ';', $g->source_vertices;
say join ';', $g->sink_vertices;

sub visit($g, $v, $p) {
    push @$p, $v;
    if ($g->is_sink_vertex($v)) {
        return;
    } else {
        for my $s ($g->successors($v)) {
            visit($g, $s, $p)
        }
    }
}

my $p = [];
for my $v ($g->source_vertices) {
    visit($g, $v, $p);
}
use Data::Dumper; say Dumper $p;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-21 20:53:25

我修改了代码,将部分路径传递到visit(),并让visit()从提供的部分路径返回所有可能的完整路径:

代码语言:javascript
运行
复制
sub visit($g, $path) {
    my $v = $path->[-1];
    if ($g->is_sink_vertex($v)) {
        return $path;
    } else {
        my @more;
        for my $s ($g->successors($v)) {
            push @more, visit($g, [ @$path, $s ])
        }
        return @more;
    }
}

my @p;
for my $v ($g->source_vertices) {
    push @p, visit($g, [$v]);
}
use Data::Dumper; say Dumper @p;

然后,可以使用map减少循环:

代码语言:javascript
运行
复制
sub visit($g, $path) {
    my $v = $path->[-1];
    if ($g->is_sink_vertex($v)) {
        return $path;
    } else {
        return map { visit($g, [ @$path, $_ ]) } $g->successors($v);
    }
}

my @p = map { visit($g, [$_]) } $g->source_vertices;
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52919516

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档