最小路徑覆蓋

2022-05-30 17:36:08 字數 1176 閱讀 8838

路徑覆蓋指乙個路徑的集合中所有路徑點集的並集為原圖點集。最小路徑覆蓋使路徑集合大小最小。

路徑覆蓋分為可否重複選點兩種。可重複選點在建模中加大流量即可。

考慮對於這個模型建出來的圖求出的最小割是什麼。它實際上是最大的可以合併的路徑條數。因為每合併兩條路徑相當於總路徑數就減少了,所以有最小路徑覆蓋等於點數減最大匹配

其中最大匹配就是我們剛才的模型。可以發現,我們實際上就是建了乙個二分圖在求最大匹配。

題意如上,要求構造方案。

我的構造方式如下:利用並查集,對於每條道路的端點,若這條邊被選擇了就將這兩條邊加入乙個並查集,每個並查集代表一條路徑。最後從每個路徑的起點進行一遍搜尋即可。

#include#include#include#include#include#includeusing namespace std;

inline int read()

namespace star

int dep[maxn];

inline bool bfs()

inline void work()

}signed main()

給你若干單向道路,並且每個點有乙個可以從任意位置任意時刻到達該點的代價。求遍歷所有點的最小代價。

參照最小路徑覆蓋的思路,拆出來的第二個點與匯點間的連邊表示到達該點。建模方式如下:

跑最小費用最大流即為答案。正確性,考慮建出來的圖,因為源點到所有點都有傳送的邊,所以跑最小割一定會經過所有點,並且因為都是單向邊且流量為 1,所以保證正確。

#include#include#include#include#include#include#includeusing namespace std;

inline int read()

namespace star

int dis[maxn],pre[maxn];

bool vis[maxn];

inline bool spfa()

} return pre[t];

} int a[maxn];

inline void work()

int ans=0;

while(spfa())

printf("%d\n",ans); }}

signed main()

最小路徑覆蓋問題(最小路徑覆蓋)

本題題目描述可以發現很明顯的最小路徑覆蓋問題,又因為最小路徑覆蓋 節點數 二分圖最大匹配數,所以本題可以用匈牙利演算法求出二分圖最大匹配數,也可以向第一題那樣用網路流模型求出最大匹配數。本題建模時不同在於,每個點要分成兩個點,乙個為起點,乙個為終點,再來求二分圖最大匹配。然後麻煩就在於本題也要輸出路...

最小路徑覆蓋

zoj 2521 led display 題意 七段數碼顯示器,乙個數碼上的7段燈可以選擇滅掉一些後重複使用這個數碼,但滅掉的段不能再亮了。比如 6 可以 滅掉左小角的一段變成 5 來使用。但自己不能重複使用,即最少滅一段才能再次使用。現在按次序給出 乙個要現實的數碼序列,求需要的最少的燈數,使得能...

最小路徑覆蓋

差不多是模板題了 分析 最小路徑覆蓋 n 最大匹配數 n為 總點數 因為匹配的點 相互 交叉形成一條條最長路徑 剩餘沒匹配的點需要進行就是需要匹配數 及 最小路徑覆蓋數 include using namespace std define maxn 1005 int match maxn int v...