最短路徑-PHP簡單實現(xiàn)

$list = [

[1,3,10],

[1,5,30],

[1,6,100],

[2,3,5],

[3,4,50],

[4,6,10],

[5,6,60],

[5,4,20]

];

$point_num = 6;

$a = []; //總數(shù)組

$b = []; //當前最短路徑

$c = []; //已經(jīng)遍歷的頂點

$max_v = 10000;

for ($i=1; $i <=$point_num ; $i++) {

    for ($j=1; $j <=$point_num ; $j++) {

        $a[$i][$j] = $max_v;

    }

}

foreach ($list as $v) {

    $a[$v[0]][$v[1]] = $v[2];

}

//計算頂點1到各個頂點的最短路徑

$b = $a[1];

$c[] = 1;

cal($a, $b, $c, $max_v);

function cal($a, $b, $c, $max_v){

    $min_k = find_min($b, $c);

    if ($min_k == -1) {

        var_dump($b);exit;

    }

    $c[] = $min_k;

    $tmp = $a[$min_k];

    foreach ($tmp as $k => $v) {

        if ($v == $max_v) {

            continue;

        }

        if ($v + $b[$min_k] < $b[$k]) {

            $b[$k] = $v + $b[$min_k];

        }

    }

    cal($a, $b, $c, $max_v);

}

function find_min($b, $c){

    $min_k = -1;

    foreach ($b as $k => $v) {

        if (in_array($k, $c)) {

            continue;

        }

        if ($min_k == -1) {

            $min_k = $k;

            continue;

        }

        if ($v < $b[$min_k]) {

            $min_k = $k;

            continue;

        }

    }

    return $min_k;

}

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容