網路流24題 最小路徑覆蓋問題

2022-05-31 04:30:13 字數 2015 閱讀 2690

description

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

設計乙個有效演算法求乙個有向無環圖$g$的最小路徑覆蓋。

input

第$1$行有$2$個正整數$n$和$m$。$n$是給定有向無環圖$g$的頂點數,$m$是$g$的邊數。

接下來的$m$行,每行有$2$個正整數$i,j$,表示一條有向邊$(i,j)$。

output

從第$1$行開始,每行輸出一條路徑。

最後一行是最少路徑數。

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

1 4 7 10 11

2 5 8

3 6 9 3

hint

$n\;\leq\;150$

solution

對於乙個路徑覆蓋,有如下性質:

所以我們可以把每個頂點拆成兩個頂點,乙個是出發點$x_i$,乙個是目標點$y_i$,建立二分圖模型。該二分圖的任何乙個匹配方案,都對應了乙個路徑覆蓋方案。如果匹配數為$0$,那麼顯然路徑數=頂點數。每增加一條匹配邊,那麼路徑覆蓋數就減少乙個,所以路徑數=頂點數-匹配數。要想使路徑數最少,則應最大化匹配數,所以要求二分圖的最大匹配。

#include#include

#include

#include

#include

#include

#include

#include

#include

#include

#define n 305

#define m 46000

using

namespace

std;

struct

graphe[m];

int a[n],g[n],dep[n],n,m,l,s,t,ans,cnt=1

;bool

v[n];

queue

q;inline

void addedge(int x,int y,int

f) inline

void adde(int x,int y,int

f)inline

bool bfs(int

u) }

return

dep[t];

}inline

int dfs(int u,int

f)

return

ret;

}inline

intdinic()

}inline

void find(intu)}

inline

void

aireen()

s=(n<<1)+1;t=s+1

;

for(int i=n;i;--i)

adde(s,i,1);

for(int i=1;i<=n;++i)

adde(i+n,t,1

); ans=n-dinic();

v[s]=v[t]=true

;

for(int i=1;i<=n;++i)

if(!v[i])

printf(

"%d\n

",ans);

}int

main()

網路流24題 最小路徑覆蓋 (最小路徑覆蓋)

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

網路流24題 最小路徑覆蓋問題

有向無環圖最小路徑覆蓋,可以轉化成二分圖最大匹配問題,從而用最大流解決。構造二分圖,把原圖每個頂點i拆分成二分圖x,y集合中的兩個頂點xi和yi。對於原圖中存在的每條邊 i,j 在二分圖中連線邊 xi,yj 然後把二分圖最大匹配模型轉化為網路流模型,求網路最大流。最小路徑覆蓋的條數,就是原圖頂點數,...

最小路徑覆蓋問題(網路流24題)

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