最小路徑覆蓋

2021-10-24 13:11:17 字數 3059 閱讀 4733

給定有向圖 g=(

v,e)

g=(v,e)

g=(v,e

)。設 p

pp 是 g

gg 的乙個簡單路(頂點不相交)的集合。如果 v

vv 中每個頂點恰好在 p

pp 的一條路上,則稱 p

pp 是 g

gg 的乙個路徑覆蓋。p 中路徑可以從 v

vv 的任何乙個頂點開始,長度也是任意的,特別地,可以為 0

00。g

gg 的最小路徑覆蓋是 g

gg 的所含路徑條數最少的路徑覆蓋。

設計乙個有效演算法求乙個有向無環圖 g

gg 的最小路徑覆蓋。

input

第 1

11 行有 2 個正整數 n

nn 和 m

mm。n

nn 是給定有向無環圖 g

gg 的頂點數,m

mm 是 g

gg 的邊數。

接下來的 m

mm 行,每行有 2

22 個正整數 u

uu 和 v

vv,表示一條有向邊 (i,

j)

(i,j)

(i,j)。

output

從第 1

11 行開始,每行輸出一條路徑。

檔案的最後一行是最少路徑數。

example

樣例輸入

11121

2131

4253

6475

8697

108119

1110

11

樣例輸出

147

101125

8369

3

hint

1≤n

≤200,1

≤m

≤6000

1≤n≤200,1≤m≤6000

1≤n≤20

0,1≤

m≤60

00把原圖的每個點 v

vv 拆成 v

xv_x

vx​和 v

yv_y

vy​兩個點,如果有一條有向邊 a

aa->b

bb,那麼就加邊 a

xa_x

ax​−>b

yb_y

by​。這樣就得到了乙個二分圖。那麼最小路徑覆蓋=原圖的結點數−

-−新圖的最大匹配數

#include

using

namespace std;

const

int maxn=

1e4+7;

const

int maxm=

2e5+7;

const

int inf=

0x3f3f3f3f

;int n,m,u,v;

struct dinic e[maxm]

;int head[maxn]

, dep[maxn]

, tol, ans;

int cur[maxn]

;int src, sink, n;

void

add(

int u,

int v,

int f)

bool

bfs()}

}return

false;}

intdfs

(int x,

int maxx)}}

return0;

}int

dinic

(int s,

int t)

return ans;

}void

init

(int n)

} g;

int pre[maxn]

,sec[maxn]

;template

<

typename t>

inline

void

read

(t &x)

while

(isdigit

(c))

x *= p;

}template

<

typename t>

inline

void

print

(t x)

static

int cnt;

static

int a[50]

; cnt =0;

dowhile

(x);

for(

int i = cnt; i >=

1; i--

)putchar

(a[i]

+'0');

//puts("");

}int isnot_head[maxn]

,to[maxn]

;int

main()

for(

int i =

1; i <= n; i++

)for

(int i = n +

1; i <= n *

2; i++

)for

(int i =

0; i <= t; i++

) to[i]

= i;

int ans = g.

dinic

(s, t)

;for

(int i =

2; i <= g.tol; i+=2

)}for(

int i =

1; i <= n; i++

)puts(""

);}}

print

(n - ans)

;puts(""

);return0;

}

最小路徑覆蓋問題(最小路徑覆蓋)

本題題目描述可以發現很明顯的最小路徑覆蓋問題,又因為最小路徑覆蓋 節點數 二分圖最大匹配數,所以本題可以用匈牙利演算法求出二分圖最大匹配數,也可以向第一題那樣用網路流模型求出最大匹配數。本題建模時不同在於,每個點要分成兩個點,乙個為起點,乙個為終點,再來求二分圖最大匹配。然後麻煩就在於本題也要輸出路...

最小路徑覆蓋

zoj 2521 led display 題意 七段數碼顯示器,乙個數碼上的7段燈可以選擇滅掉一些後重複使用這個數碼,但滅掉的段不能再亮了。比如 6 可以 滅掉左小角的一段變成 5 來使用。但自己不能重複使用,即最少滅一段才能再次使用。現在按次序給出 乙個要現實的數碼序列,求需要的最少的燈數,使得能...

最小路徑覆蓋

差不多是模板題了 分析 最小路徑覆蓋 n 最大匹配數 n為 總點數 因為匹配的點 相互 交叉形成一條條最長路徑 剩餘沒匹配的點需要進行就是需要匹配數 及 最小路徑覆蓋數 include using namespace std define maxn 1005 int match maxn int v...