P2764 最小路徑覆蓋問題(網路流)

2021-08-17 15:58:41 字數 2719 閱讀 9588

給定有向圖g=

(v,e

) g=(

v,e)

。設p p

是g' role="presentation" style="position: relative;">g

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

v v

中每個頂點恰好在

p' role="presentation" style="position: relative;">p

p的一條路上,則稱

p p

是g' role="presentation" style="position: relative;">g

g的乙個路徑覆蓋。

p p

中路徑可以從

v' role="presentation" style="position: relative;">v

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

g g

的最小路徑覆蓋是

g' role="presentation" style="position: relative;">g

g的所含路徑條數最少的路徑覆蓋。設計乙個有效演算法求乙個有向無環圖

g g

的最小路徑覆蓋。

件第1 行有2個正整數

n' role="presentation" style="position: relative;">nn和

m m

。n' role="presentation" style="position: relative;">n

n是給定有向無環圖

g g

的頂點數,

m' role="presentation" style="position: relative;">mm是

g g

的邊數。接下來的

m' role="presentation" style="position: relative;">m

m行,每行有2 個正整數

i i

和j' role="presentation" style="position: relative;">j

j,表示一條有向邊(i

,j) (i,

j)。從第1 行開始,每行輸出一條路徑。檔案的最後一行是最少路徑數。

輸入樣例#1:

11 12

1 21 3

1 42 5

3 64 7

5 86 9

7 10

8 11

9 11

10 11

輸出樣例#1:
1 4 7 10 11

2 5 8

3 6 9

3

1

≤n≤150,1

≤m≤6000

1 ≤n

≤150,1

≤m≤6000

傳送門!!!

這是乙個網路流的套路,這玩意都能建網路流,orz,蒟蒻無話可說。

對於每乙個點,它最多有兩條邊在路徑當中,所以我們建網路流,點一分為二,在圖中相連的點進行連邊,匯點連1,源點連1,中間連in

f inf

跑最大流。最大流的意義就是最小路徑覆蓋中連邊的條數。我們用n−

flow

(流量)

n −f

low(

流量)就是答案。

畫個圖理解一下:

紅色就代表了選擇的連邊,1−

2−3−

4,5,

1 −2

−3−4

,5,兩條路。顯然有多解,所以有spj。

#include

#include

#include

#include

using

namespace

std;

struct lxyb[50005];

int n,m,cnt=-1,head[505],s,t,num;

int layer[505];

intconst inf=0x7f7f7f7f;

int to[155];bool vis[155];

int ans;

void add(int op,int ed,int flow)

bool bfs()

} return layer[t];

} int dfs(int u,int a)

return flow;

} int dinic()

int main()

for(int i=1;i<=n;i++) add(s,i,1),add(i,s,0);

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

ans=num-dinic();

for(int i=1;i<=n;i++)

for(int i=1;i<=n;i++)

if(vis[i]==0)

printf("\n");

} printf("%d",ans);

}

P2764 最小路徑覆蓋問題

我做24題的第六題,輸出路徑還是有點糊塗 給定有向圖g v,e 設p是圖g上若干點不相交的簡單路徑的集合,若每個點v屬於v都存在於唯一一條p中的路徑上,則p是g的一條路徑覆蓋。路徑數量最少的路徑覆蓋稱為最小路徑覆蓋。用minpc g 表示圖g的最小路徑覆蓋數.有向無環圖的最小路徑覆蓋問題可轉化為二分...

P2764 最小路徑覆蓋問題

問題描述 每條邊的容量均為1。求網路g1的 0 x 0 y 最大流。程式設計任務 對於給定的給定有向無環圖g,程式設計找出g的乙個最小路徑覆蓋。輸入格式 件第1 行有2個正整數n和m。n是給定有向無環圖g 的頂點數,m是g 的邊數。接下來的m行,每行有2 個正整數i和j,表示一條有向邊 i,j 輸出...

P2764 最小路徑覆蓋問題

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