NKOI 1938 最小路徑覆蓋

2021-07-16 02:13:56 字數 1602 閱讀 9914

【線性規劃與網路流24題 3】最小路徑覆蓋

time limit:10000ms  memory limit:65536k

total submit:35 accepted:14 

case time limit:1000ms

description

給定有向圖g=(v,e)。設p 是g 的乙個簡單路(頂點不相交)的集合。如果v 中每個頂點恰好在p 的一條路上,則稱p是g 的乙個路徑覆蓋。p 中路徑可以從v 的任何乙個頂點開始,長度也是任意的,特別地,可以為0。g 的最小路徑覆蓋是g 的所含路徑條數最少的路徑覆蓋。設計乙個有效演算法求乙個有向無環圖g 的最小路徑覆蓋。 

對於給定的給定有向無環圖g,程式設計找出 g的乙個最小路徑覆蓋。 

由於本oj無special judge , 所以只需要輸出路徑的條數

input

第1 行有 2個正整數 n和 m。n是給定有向無環圖(0

output

一行,包含乙個整數,表示最少路徑數

sample input

11 12 

1 2

1 3

1 4

2 5

3 6

4 7

5 8

6 9

7 10

8 11

9 11

10 11

sample output

3
source

感謝 wo_ai_wangyuan 修改題目並放上資料

網路流模型

我們先將n個點分成x,y兩個集合,如果u到v有一條邊,就將u放在x集合,v放在y集合

然後就是網路流建圖,這裡先給出建圖方式

設源點為op,匯點為ed,那麼op與x集合所有點連一條容量為1的邊(即x中的每個點只能用一次)

x集合與y集合中能互相到達的兩點連一條容量》=1的邊,最後y集合中每乙個點與ed連一條容量為1的邊(即y中的每個點只能用一次)

這樣建圖後求出來的最大流就一定是最大匹配數(想一想為什麼)

ans=n-最大匹配,如果無匹配,顯然要n條路徑才能覆蓋所有點,兩個點匹配意味著將可以把它們用一條路徑覆蓋,路徑數就可以減1

#include#includeusing namespace std;

const int maxn=305,inf=1e9;

int n,m, g[maxn][maxn],op,ed;

int dis[maxn],vd[maxn];

int dfs(int u,int flow)

if(dis[op]>=ed)return delta;

vd[dis[u]]--;

if(vd[dis[u]]==0)dis[op]=ed;

dis[u]++;

vd[dis[u]]++;

return delta;

} int main()

while(dis[op]

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

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

最小路徑覆蓋

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

最小路徑覆蓋

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