P2764 最小路徑覆蓋問題 網路流重溫

2022-05-03 13:06:37 字數 1338 閱讀 3143

這個題目之前第一次做的時候感覺很難,現在好多了,主要是二分圖定理不太記得了,二分圖定理

知道這個之後就很好寫了,首先我們對每乙個點進行拆點,拆完點之後就是跑最大流,求出最大匹配數,

然後就可以求出最小路徑覆蓋數,這個題目的難點在於求路徑,其實很好寫,就是用乙個陣列來寫就可以了。

每乙個點都記錄一下它下乙個點是哪個位置,最後把拆開了的點合併就可以了。

#include #include 

#include

#include

#include

#include

#include

#include

#define inf 0x3f3f3f3f

using

namespace

std;

const

int maxn = 3e5 + 10

;typedef

long

long

ll;struct

edge

};vector

e;vector

g[maxn];

int level[maxn];//

bfs分層,表示每個點的層數

int iter[maxn];//

當前弧優化

intm;

bool

tag[maxn];

intto[maxn];

void init(int

n) void addedge(int u, int v, int

c) void bfs(int s)//

預處理出level陣列

//直接bfs到每個點}}

}int dfs(int u, int t, int f)//

dfs尋找增廣路}}

return0;

}int maxflow(int s, int

t) }

return

flow;

}int

main()

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

memset(to, -1, sizeof

(to));

memset(tag,

0, sizeof

(tag));

int ans =maxflow(s, t);

ans = n -ans;

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

printf("\n

");}

printf(

"%d\n

", ans);

return0;

}

view code

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 所含路徑條數最少的路徑覆蓋。設計乙個有...