首頁 > 後端開發 > php教程 > 。冗餘連接

。冗餘連接

Barbara Streisand
發布: 2025-01-30 08:04:39
原創
585 人瀏覽過

684。冗餘連接

難度:中等

>>主題:深度優先搜索,廣度優先搜索,聯合查找,圖形

在這個問題中,一棵樹是連接且沒有循環的無向圖>您獲得了一個圖形,該圖是從1到n標記的n個節點開始的樹,並增加了一個邊緣。添加的邊緣具有從1到n選擇的兩個不同的

的頂點,並且不是已經存在的邊緣。該圖表示為長度為n的數組邊緣,其中邊緣[i] = [ai ,bi]表明節點ai 返回可以刪除的邊緣,以便結果圖是N節點的樹。如果有多個答案,請返回在輸入

>

>示例1:

>輸入: edges = [[1,2],[1,3],[2,3]]

>輸出:。冗餘連接 [2,3]

  • >>示例2:
>輸入:

edges = [[1,2],[2,3],[3,4],[1,4],[1,5]] >輸出:

[1,4]

。冗餘連接

    >約束:
  • >
  • n == edge.length
  • 3< = n< = 1000
  • edges [i] .length == 2

1< = a i< bi

< = edges.length
  • a
  • i
  • ! = b
  • i
  • >
  • 沒有重複的邊緣。 給定的圖是連接的。
  • 解決方案: 冗餘連接
  • 問題要求我們確定圖形中的邊緣,可以將圖形轉換為有效的樹。樹是連接和無環的無向圖。給我們一個圖形,該圖是從樹開始的,但通過添加一個額外的邊緣進行了修改。我們的目標是找到並返回這個額外的優勢。
  • >
  • 關鍵點
該圖是

未取向

刪除冗餘邊緣後所得的圖形必須沒有周期。 答案應返回輸入中出現的最後一個

的邊緣,如果有多個有效的解決方案。

由於單個額外的邊緣,該圖最多可以具有一個週期。

    方法
  1. 該方法涉及使用>深度優先搜索(DFS)來檢測週期:
  2. >鄰接列表表示
    • >使用鄰接列表來表示圖形。該結構適合有效地執行DF。
  3. 通過DFS
  4. 循環檢測:> 在將邊緣添加到圖表之前,請使用DFS檢查邊緣兩個頂點之間是否已經有一個路徑。如果有的話,添加此邊緣將形成一個週期。

    返回邊緣
  5. 如果檢測到一個週期,請返回當前邊緣作為冗餘連接。

    • 計劃
  6. 解析輸入邊緣。

維護一個鄰接列表以動態跟踪圖形的連接。

對於每個邊緣:
  1. 使用遞歸DFS函數檢查兩個頂點之間的路徑是否存在。
  2. 如果存在路徑,請返回邊緣作為冗餘連接。
  3. 否則,將邊緣添加到鄰接列表中。
    • 如果找不到冗餘邊緣,則返回空結果(儘管這不會按照問題的限制發生)。
    • >讓我們在PHP中實現此解決方案: 684。冗餘連接
  4. 解釋:

dfs實現

<?php /**
 * @param Integer[][] $edges
 * @return Integer[]
 */
function findRedundantConnection($edges) {
    ...
    ...
    ...
    /**
     * go to ./solution.php
     */
}

/**
 * Helper function to perform DFS and check connectivity
 *
 * @param $src
 * @param $target
 * @param $visited
 * @param $adjList
 * @return bool
 */
private function isConnected($src, $target, &$visited, &$adjList) {
    ...
    ...
    ...
    /**
     * go to ./solution.php
     */
}

// Example usage:
$edges1 = [[1,2],[1,3],[2,3]];
$edges2 = [[1,2],[2,3],[3,4],[1,4],[1,5]];

print_r(findRedundantConnection($edges1)) . "\n"; // Output: [2,3]
print_r(findRedundantConnection($edges2)) . "\n"; // Output: [1,4]
?>
登入後複製

從一個節點開始,然後遞歸訪問其鄰居。

使用訪問的數組避免重新訪問節點。
    如果在遍歷期間達到目標節點,則存在一條路徑。
  1. edge Addad
    • 如果在邊緣的頂點之間不存在路徑,請將邊緣添加到鄰接列表中,然後繼續進行下一個邊緣。
  2. 冗餘邊緣
  3. 如果已經存在路徑,請在形成周期時返回當前邊緣。

    • 示例演練
  4. 示例1:
  5. >輸入:edges = [[1,2],[1,3],[2,3]]

      步驟

  6. >將鄰接列表初始化為[]。

處理邊緣:

添加[1,2]→圖:{1:[2],2:[1]}

添加[1,3]→圖:{1:[2,3],2:[1],3:[1]} 檢查[2,3]:DFS找到路徑→返回[2,3]。

>輸出
    :[2,3]
  1. 示例2:
    • > input
    • :edges = [[1,2],[2,3],[3,4],[1,4],[1,5]]
    • 步驟
    >將鄰接列表初始化為[]。
處理邊緣:

添加[1,2]→圖:{1:[2],2:[1]}

添加[2,3]→圖:{1:[2],2:[1,3],3:[2]}

添加[3,4]→圖:{1:[2],2:[1,3],3:[2,4],4:[3]}

檢查[1,4]:DFS找到路徑→返回[1,4]。

輸出

:[1,4] 時間複雜性
    • dfs traversal
      • 對於每個邊緣,我們執行一個DFS來檢查連接。 >
      • 最差的情況:
      • o(v e),其中 vv 是頂點的數量,> e> e
      • 是邊緣的數量。
  • 總複雜度

    • 由於我們為每個邊緣執行DFS,因此總體複雜性為o(e×(v e))
  • 空間複雜度

    • 鄰接列表:o(v e)
    • 訪問陣列:o(v)
    • o(v e)
  • 輸出示例

    示例1:

    >輸入:[[[1,2],[1,3],[2,3]] >

    >輸出:[2,3]

    示例2:

    > input :[[[1,2],[2,3],[3,4],[1,4],[1,5]] >輸出
    :[1,4] 可以使用基於dfs的方法來有效解決該問題以檢測週期。此方法動態構建圖形並在每個步驟中檢查冗餘邊緣。該解決方案通過遵守問題約束並輸出形成周期並發生在輸入中的邊緣的邊緣來確保正確性。 >

    聯繫鏈接

    如果您發現此系列有幫助,請考慮在Github上給出 reposority >在您喜歡的社交網絡上分享帖子?您的支持對我來說意義重大!

    > 如果您想要這樣的更多有用的內容,請隨時關注我:>

    LinkedIn

    github

    以上是。冗餘連接的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    來源:dev.to
    本網站聲明
    本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
    作者最新文章
    熱門教學
    更多>
    最新下載
    更多>
    網站特效
    網站源碼
    網站素材
    前端模板