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 的所含路徑條數最少的路徑覆蓋。設計乙個有效演算法求乙個有...