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

2021-09-26 16:15:53 字數 1491 閱讀 2597

最小路徑覆蓋

題面:

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

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

思路:首先有個結論:dag的最小路徑覆蓋數=dag圖中的節點數-相應二分圖中的最大匹配數.

進行網路流建模,先將dag建成標準二分圖,這時我們先將乙個點拆a成出點ax和入點ay,那麼在連有向邊a -> b的時候就將ax連向by。就將有向圖變成了乙個二分圖

#include

#define inf 0x3f3f3f3f

using

namespace std;

const

int n =

40005

;int n, m, ss, tt;

int dis[n]

;int cur[n]

;queue<

int> q;

int mark[n]

,to[n]

;struct edge e[n *4]

;int head[n]

, cnt =-1

;void

add(

int from,

int to,

int value)

bool

bfs(

int s,

int t)}}

return dis[t]!=-

1;}int

dfs(

int x,

int t,

int maxflow)

e[i]

.value -

= f;

e[i ^1]

.value +

= f;

ans +

= f;

}return ans;

}int

dinic

(int s,

int t)

return ans;

}int

main()

ss =

0, tt = n+n+1;

for(

int i =

1; i <= n; i++

)for

(int i =

1; i <= n; i++

)int ans=n-

dinic

(ss, tt)

;for

(int i=

1;i<=n;i++

)printf

("\n");

}printf

("%d\n"

,ans)

;return0;

}

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