hdu 1151 最小覆蓋路徑演算法證明

2021-07-08 10:47:18 字數 758 閱讀 2991

又是二分圖。若還不知道匈牙利演算法,看我前面的文章

先把每個點拆成兩個,乙個表示出,乙個表示入,根據資料輸入,對應的出點和對應入點之間構造了一條邊。這樣就有了乙個二分圖。

有向圖的最小路徑覆蓋 = 總的點數(為拆分前的) - 最大匹配數。

證明如下:

先假設所有點我們都派出乙個傘兵。然後每增加一條匹配,就代表我們從乙個點出走向乙個點。並且根據最大匹配的定義,我們可以直接看作是將這兩個點合併到乙個路徑集合中,這個時候我們就可以減少乙個傘兵。 所以 路徑覆蓋 = 總的點數 - 最大匹配數 。

然而這樣我們並沒有證明 是 「最小」覆蓋。 接下來證明最小。 假設 不是最小,那麼也就意味著還可以減少傘兵,而減少傘兵就必須合併某兩個點(即匹配),而匹配已經最大,所以矛盾。

即 需要派遣的傘兵數 = 總點數 - 匹配數。    最少傘兵派遣 = 總點數 - 最大匹配數。

#include #include #include #include #include #include #define base 10

using namespace std;

bool vis[130],map[130][130];

int match[130],n,m;

bool find(int p)

} }return 0;

}int main()

for(i = 1; i <= m; i++)

printf("%d\n",m-count);

}}

HDU1151最小路徑覆蓋

dag圖 無迴路有向圖 的最小路徑覆蓋 用盡量少的不相交簡單路徑覆蓋有向無環圖 dag 的所有頂點,這就是dag圖的最小路徑覆蓋問題。最小路徑覆蓋數 節點數 最大匹配數 include include include using namespace std const int maxn 200 in...

HDU 1151 Air Aaid 最小路徑覆蓋

題目大意 在乙個城鎮,有m個路口,和n條路,這些路都是單向的,而且路不會形成環,現在要弄一些傘兵去巡查這個城鎮,傘兵只能沿著路的方向走,問最少需要多少傘兵才能把所有的路口搜一遍。這個題目就轉換成求解有向無環圖的最 小路徑覆蓋問題了。乙個結論 有向無環圖的最小路徑覆蓋 該圖的頂點數 該圖的最大匹配。a...

HDU 1151 Air Raid(最小路徑覆蓋)

解答 最小路徑覆蓋問題 在乙個有向圖中,使用最少的路徑訪問完所有的節點。最小路徑覆蓋 頂點數 最大匹配數 有向圖g v,e 將v中每個頂點vi分成vi 與vi 如果存在一條vi到vj的邊,那麼就在二分圖中連線一條vi 與vj 的邊。證明參見 include using namespace std c...