簡體   English   中英

如何用最少的節點覆蓋圖形的所有邊?

[英]How do I cover all the edges of a graph with the minimum amount of nodes?

我被一個 NP 問題困擾了幾天,我正在尋找新的方法來看待這個問題。

這座城市有 360 個安全攝像頭,需要在城市的所有街道交叉口放置。 這個想法是尋找需要放置的最少數量的攝像機,以便覆蓋所有街道。

在此處輸入圖像描述

不幸的是,攝像機只能覆蓋一個街區。

我將每個交叉路口視為圖形節點,而街道是邊緣,最初我認為這是某種中國 postman 問題,但該算法主要適用於您想從一個起始節點行進並覆蓋所有邊緣並返回初始節點。

那么如何用最少的攝像頭覆蓋所有街道呢?

任何形式的啟蒙都將不勝感激。

通過選擇最小數量的頂點來覆蓋圖中的所有邊是(最小)頂點覆蓋問題 這是一個 NP完全問題,因此解決一般實例的最著名算法需要指數級的時間。 (就像所有的 NP 完全問題一樣,它也在 NP 中,但這在這里不是一個有用的描述,因為許多簡單的問題也是如此。)

然而,一些圖的子類可以更快地解決。 二分圖就是這樣的 class,而網格圖(或此類的子圖)是二分圖,所以你很幸運。 對於網格圖,坐標和為偶數的頂點(圖中的黑點)構成分區中的一個部分,坐標和為奇數的頂點構成另一個部分:注意同一部分內的頂點之間沒有邊. 可以通過首先找到最大基數二分匹配來找到最小頂點覆蓋,例如在 O(|E|*sqrt(|V|)) 時間內使用Hopcroft-Karp 算法,然后應用該算法

該算法快速且易於實現。 它給出了一個很好但並不總是最優的答案。

  1. 將圖表復制到工作副本
  2. Select 任意鏈接連接節點u,v
  3. 將 u 和 v 添加到覆蓋集
  4. 刪除你的所有鏈接
  5. 從 v 中刪除所有鏈接
  6. 重復直到工作副本中沒有鏈接
  7. 從覆蓋集中刪除任何葉節點(只有一個鏈接的節點)

PathFinder cams選項是該算法的 C++ 實現,使用 C++ 和 boost 圖形庫。

這個輸入

l 0 1 1
l 0 2 1
l 1 2 1
l 2 3 1
l 2 4 1
l 2 5 1

在此處輸入圖像描述

C++ 代碼:

   // store indices of nodes that cover links
    std::set< int > setCover;

    // working copy on input graph
    auto work = myGraph;

    graph_traits<graph_t>::out_edge_iterator ei, ei_end;
    
    // loop until all links are covered
    while (num_edges(work))
    {
        // select first link in working graph
        auto it = edges(work).first;
        int u = source(*it, work);
        int v = target(*it, work);

        // add  non leaf nodes on selected link to cover
        if( out_degree( u, myGraph ) > 1 )
            setCover.insert( u );
        if( out_degree( v, myGraph ) > 1 )
            setCover.insert( v );

        // remove all links that can be seen from new cover nodes
        for (boost::tie(ei, ei_end) = out_edges(u, work); ei != ei_end; ++ei)
        {
            remove_edge(*ei, work);
        }
        for (boost::tie(ei, ei_end) = out_edges(v, work); ei != ei_end; ++ei)
        {
            remove_edge(*ei, work);
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM