如何找到顶点i和j之间的最小路径,它们之间最多有S个顶点

时间:2017-06-11 14:40:07

标签: algorithm graph path dynamic-programming floyd-warshall

这是我实现Floyd算法的代码。如何更改此算法以解决此问题: 找到顶点i和j之间的最小距离,它们之间最多有S个顶点。

void Floyd_Warshal(int graph[MAX][MAX], int D[MAX][MAX], int P[MAX][MAX], int numberOfNodes){
    for(int i = 0 ; i < numberOfNodes ; i++)
        for(int j = 0 ; j < numberOfNodes ; j++){
            D[i][j] = graph[i][j];
            P[i][j] = -1;
        }
    for(int k = 0 ; k < numberOfNodes ; k++)
        for(int i = 0 ; i < numberOfNodes ; i++)
            for(int j = 0 ; j < numberOfNodes ; j++)
                if(D[i][j] > D[i][k] + D[k][j]){
                    D[i][j] = D[i][k] + D[k][j];
                    P[i][j] = k;
                }
}

1 个答案:

答案 0 :(得分:1)

每次迭代#!/usr/bin/env perl use strict; use warnings; my @files = <*>; my @extensions = map { my ($f) = m/\.(.*?)$/; $f; } @files; my @unique_ext; my %seen; foreach my $value (@extensions) { if (! $seen{$value}) { push @unique_ext, $value; $seen{$value} = 1; } } use Data::Dumper; foreach my $current (@unique_ext) { my $start = 'aaaaaa'; my @file_list = <*$current>; foreach my $file (@file_list) { rename $file, "$start.$current"; $start ++; } } 上的

Bellman-Ford algorithm(不使用当前迭代中找到的路径的略微修改后的版本)可以找到最多使用$ ls LKG.JPG jlgaej.gif owutljff.JPG uoeoo.jpg $ perl rename.pl $ ls aaaaaa.JPG aaaaaa.gif aaaaaa.jpg aaaaaa.pl aaaaab.JPG 条边的所有最短路径。 Floyd-Warshall算法不是解决这类问题的合适方法。

您也可以修改Dijksta's algorithm,但需要更改图表。修改后的图形将包含i个顶点(对于每个顶点和每个可能的路径长度)。这个answer详细解释了图形结构。