首页 > 解决方案 > 生成图和 PHP_INT_MAX

问题描述

我正在阅读“PHP 7 数据结构和算法”一章“使用 Floyd-Warshall 算法的最短路径”,作者正在使用以下代码生成图表:

$totalVertices = 5;
$graph = [];
for ($i = 0; $i < $totalVertices; $i++) {
    for ($j = 0; $j < $totalVertices; $j++) {
        $graph[$i][$j] = $i == $j ? 0 : PHP_INT_MAX;
    }
}

我不明白这一行:

$graph[$i][$j] = $i == $j ? 0 : PHP_INT_MAX;

看起来像单行 if 语句

是一样的吗?

if ($i == $j) {
    $graph[$i][$j] = 0;
} else {
    $graph[$i][$j] = PHP_INT_MAX;
}

使用 PHP_INT_MAX 有什么意义?最后这张图是什么样子的?

标签: phpgraph

解决方案


你在这里有两个问题。

首先是关于语法condition ? val_if_true : val_if_false。这称为“三元运算符”。您对行为的评估是正确的。

二是关于使用PHP_INT_MAX。两个节点之间的所有距离都被初始化为两个值之一:0如果节点ij是相同的节点(即顶点),以及PHP_INT_MAX如果节点不相同(即边)。也就是说,一个节点到它自己的距离是0,一个节点到任何其他节点的距离是 PHP 识别的最大整数值。原因是 Floyd-Warshall 算法利用“无穷大”的概念来表示尚未计算的最小距离,但由于 PHP 中没有“无穷大”的概念,所以以该值PHP_INT_MAX作为立场-为此。


推荐阅读