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

2022-05-23 22:00:13 字數 1181 閱讀 3982

題面

題解原諒當年的我太弱,把$dinic$拼錯。

upd:我發現我當年判邊在不在最大流上也是假的。應該看$w[i]是否為0$。

upd:應該是有必要補說一下的,一開始,每個點自成乙個路徑,然後乙個合法的匹配就是把兩條路徑合二為一,路徑數$-1$,所以邊可以是有向的。並且不能自己和自己連邊。

最後的路徑數是$n-g.dinic()$

#include#include

#define ri register int

#define n 20000

using

namespace

std;

intn,m;

int head[n],cnt=1

;int

dep[n],que[n],nex[n],pre[n];

int to[7*n],nxt[7*n],wei[7*n],cur[n];

bool

inq[n],vis;

void add(int u,int v,int

w) bool

bfs()

} return dep[2*n+2]<=n;

}int dfs(int x,int

mi)

int used=0;

intrlow;

for (ri i=cur[x];i;i=nxt[i])

used+=rlow;

wei[i]-=rlow;

wei[i^1]+=rlow;

if (used==mi) return

used;}}

} return

used;

}void

dicnic()

}}void print(int

x) int

main()

for (ri i=1;i<=n;i++) add(2*n+1,i,1),add(i,2*n+1,0

);

for (ri i=n+1;i<=2*n;i++) add(i,2*n+2,1),add(2*n+2,i,0

); dicnic();

int ans=0;

for (ri i=1;i<=n;i++) if (!pre[i]) print(i),puts(""),ans++;

cout

}

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