我正在使用 Graph package 创建一个具有四个顶点的图形,如下所示:
my $graph = Graph->new;
$graph->add_edges(qw(a b c d));
我想循环遍历两个顶点的所有可能组合,我正在使用嵌套循环。
for my $i ($graph->vertices()){
for my $j ($graph->vertices()) {
(statement[s])
}
}
然而,这会导致许多重复,例如对于 (a, b) 和 (b, a)。为了解决这个问题,我想要一个语句,使得第二个 for 循环只在 $i 在列表中早于 $j 时运行。这些不是数字,因此像 if($i < $j)
这样的语句不起作用。但是程序以相同的顺序在列表中移动。如何参考这个订单,或者设置一个订单并参考它?
编辑:如果有一种方法可以比较 for 循环中数组的索引,这可能会起作用。不过,我不确定这是否可行。
这是使用下面答案中给出的代码的完整嵌套 for 循环。
use strict;
use warnings;
use Graph;
my $graph = Graph->new;
$graph->add_edges(qw(a b c d));
my @vertices = $graph->vertices();
for my $i (0..$#vertices) {
my $vi = $vertices[$i];
for my $j ($i+1..$#vertices) {
my $vj = $vertices[$j];
my $graph = Graph->new;
$graph->add_edges(qw(a b c d));
my @vertices = $graph->vertices();
$graph->add_edge("$i", "v");
$graph->add_edge("$j", "v");
$graph->delete_edge("$i", "$j");
print $graph, "\n";
}
}
答案 0 :(得分:1)
只需将所有顶点读入数组,然后设置嵌套循环即可。
my @vertices = $graph->vertices();
for my $i (0..$#vertices) {
my $vi = $vertices[$i];
for my $j ($i+1..$#vertices) {
my $vj = $vertices[$j];
...
}
}
更新:用户说他得到了下面的输出
0-v,1-v,a-b,c-d;
0-v,2-v,a-b,c-d;
0-v,3-v,a-b,c-d;
1-v,2-v,a-b,c-d;
1-v,3-v,a-b,c-d;
2-v,3-v,a-b,c-d