洛谷 P2764 最小路徑覆蓋問題(最大流)

2021-09-11 01:16:33 字數 1665 閱讀 7492

給定有向圖 g=(v,e)g=(v,e) 。設 pp 是 gg 的乙個簡單路(頂點不相交)的集合。如果 vv 中每個定點恰好在pp的一條路上,則稱 pp 是 gg 的乙個路徑覆蓋。pp中路徑可以從 vv 的任何乙個定點開始,長度也是任意的,特別地,可以為 00 。gg 的最小路徑覆蓋是 gg 所含路徑條數最少的路徑覆蓋。設計乙個有效演算法求乙個 gap (有向無環圖) gg 的最小路徑覆蓋。

v_1=\\cup\v1​=∪

e_1=\\cup\\cup\e1​=∪∪

每條邊的容量均為 11 ,求網路 g_1g1​ 的 (x_0,y_0)(x0​,y0​) 最大流。

輸入格式:

第一行有 22 個正整數 nn 和 mm 。 nn 是給定\textgap(有向無環圖) gg 的頂點數, mm 是 gg 的邊數。接下來的 mm 行,每行有兩個正整數 ii 和 jj 表示一條有向邊 (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\leq n\leq 150,1\leq m\leq 60001≤n≤150,1≤m≤6000

由@flierking提供spj

解題思路

依舊是拆點轉化成二分圖然後dinic(),然後dfs輸出路徑。

**如下

#include #include #include #include #include #define inf 0x3f3f3f3f

#define s 0

#define t 310

using namespace std;

vectorg[355];

struct line

};vectorline;

void add_line(int x, int y)

int deep[355];

bool bfs()

} }return false;

}int dfs(int x, int mix)

} return ap;

}int dinic()

bool vis[155];

void dfs2(int x) }}

int main()

for(int i = 0; i < m; i ++)

int sum = dinic();

memset(vis, 0, sizeof(vis));

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

} cout << n - sum << endl;

for(int i = 0; i <= t; i ++)

g[i].clear();

line.clear();

}}

洛谷P2764 最小路徑覆蓋問題

剛一看到這道題十分的懵,完全不知道從何下手 然後看了看題解後發現,這道題的關鍵就是計算可以合併多少次路徑,然後最小的路徑覆蓋數就是總點數 合併次數。舉個例子 僅僅是讓你理解上面一句話,而不一定是真正的 執行流程 初始 合併1次 合併2次 合併3次 所以最後最小路徑覆蓋數即為 5 3 2 注意 1 4...

洛谷P2764 最小路徑覆蓋

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

P2764 最小路徑覆蓋問題

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