最小路徑覆蓋
題面:
給定有向圖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 的所含路徑條數最少的路徑覆蓋。設計乙個有效演算法求乙個有...