2699。修改圖邊權重
難度:難
主題:圖、堆(優先權隊列)、最短路徑
給你一個無向加權連通圖,其中包含標記為0到n - 1的n個節點,以及一個整數數組edges,其中edges[i] = [ai , b i, wi] 表示節點ai 和bi 之間有一條邊,權重為w i.
某些邊的權重為-1 (wi = -1),而其他邊的權重為正 (wi > 0) .
你的任務是修改所有邊的權重為-1,方法是在[1, 2 * 109範圍內分配正整數值 ] 使得節點來源與目的地之間的最短距離變成等於整數目標。如果有多次修改使來源和目的地之間的最短距離等於目標,則其中任何一個都將被視為正確。
如果可以使從來源到目的地的最短距離等於目標,則傳回以任意順序包含所有邊(甚至未修改的邊)的數組,如果不可能,則傳回空數組 .
注意:不允許修改初始為正權重的邊的權重。
範例1:
範例2:
範例 3:
約束:
提示:
解:
我們可以將方法分解如下:
對現有權重進行初步檢查:
暫時分配權重 1:
修改特定邊權重:
回傳修改後的邊:
讓我們用 PHP 實作這個解:2699。修改圖邊權重
<?php private $kMax = 2000000000; /** * @param $n * @param $edges * @param $source * @param $destination * @param $target * @return array|mixed */ function modifiedGraphEdges($n, $edges, $source, $destination, $target) { ... ... ... /** * go to ./solution.php */ } /** * @param $graph * @param $src * @param $dst * @return int|mixed */ function dijkstra($graph, $src, $dst) { ... ... ... /** * go to ./solution.php */ } // Example usage: // Example 1 $n = 5; $edges = [[4,1,-1],[2,0,-1],[0,3,-1],[4,3,-1]]; $source = 0; $destination = 1; $target = 5; print_r(modifyGraphEdgeWeights($n, $edges, $source, $destination, $target)); // Output: [[4,1,1],[2,0,1],[0,3,3],[4,3,1]] // Example 2 $n = 3; $edges = [[0,1,-1],[0,2,5]]; $source = 0; $destination = 2; $target = 6; print_r(modifyGraphEdgeWeights($n, $edges, $source, $destination, $target)); // Output: [] // Example 3 $n = 4; $edges = [[1,0,4],[1,2,3],[2,3,5],[0,3,-1]]; $source = 0; $destination = 2; $target = 6; print_r(modifyGraphEdgeWeights($n, $edges, $source, $destination, $target)); // Output: [[1,0,4],[1,2,3],[2,3,5],[0,3,1]] ?>
這種方法可以有效地檢查和調整邊緣權重,確保盡可能滿足目標距離。
聯絡連結
如果您發現本系列有幫助,請考慮在 GitHub 上給 存儲庫 一個星號或在您最喜歡的社交網絡上分享該帖子? 。您的支持對我來說意義重大!
如果您想要更多類似的有用內容,請隨時關注我:
以上是修改圖邊權重的詳細內容。更多資訊請關注PHP中文網其他相關文章!