網路流 最小路徑覆蓋問題

2021-06-28 19:35:02 字數 1643 閱讀 2475

每條邊的容量均為1。求網路g1的(x0,y0)最大流。

對於給定的給定有向無環圖g,程式設計找出g的乙個最小路徑覆蓋。

輸入 由檔案input.txt提供輸入資料。檔案第1 行有2個正整數n和m。n是給定有向無環圖

g 的頂點數,m是g 的邊數。接下來的m行,每行有2 個正整數i和j,表示一條有向邊(i,j)。

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

樣例輸入

11 12

1 2

1 3

1 4

2 5

3 6

4 7

5 8

6 9

7 10

8 11

9 11

10 11

樣例輸出

1 4 7 10 11

2 5 8

3 6 9

3 這個問題說白了就是乙個二分圖匹配問題為什麼呢?

轉換成網路流就是從源點連一條容量為1的邊到每乙個點,然後拆點將每乙個兩點之間有邊的連一條有向邊到另乙個點的拆了點的那個點,然後把每個拆了點的點連到匯點(容量1)。因為如果有兩個點都同時指向同乙個點那麼就只有乙個邊能過去,所以這時有流量的邊就可以看作把兩個端點合成了乙個,所以網路流的最大流量實際上就是能合成的對數,所以所有點的數量-最大流=答案

**如下:

#include 

#include

#include

#include

#include

using

namespace

std;

const

int maxn = 10000;

const

int maxm = 500000;

const

int inf = 999999999;

int tmp1[maxn], t***[maxn];

bool tmp2[maxn];

int nn, ss, number;

struct node

;struct isap

void init(int _s, int _t)

int aug(int i,int maxt)

mind = min(mind,d[v]);

}if(ag == 0)

return ag;

}void get_s(int u, int color)

int work()

bool is_changed()

void space_plan()

int next[maxn+10];

bool vis[maxn+10];

int _search()

}for(int i=1;i<=nn;i++)

if(!vis[i])

printf("\n");

}return

0; }

} isap;

void read()

int ret = isap.work();

isap._search();

printf("%d\n", nn-ret);

}int main()

網路流最小路徑覆蓋

思路 每個點x拆成兩個點x和x 分別表示x作為前驅和作為後繼。若原圖中x和y有邊,向x和y 加一條有向邊。如此構成二分圖,記此二分圖中作為前驅的節點集合為a,作為後繼的節點集合為b。跑最大匹配,沒有匹配的點的個數 n 最大匹配數 就是需要的最少的路徑條數。正確性 二分匹配可以保證每個點頂多只有乙個前...

網路流24題 最小路徑覆蓋 (最小路徑覆蓋)

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

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

題目大意 對於給定的有向無環圖,找出其中的最小路徑覆蓋,並列印出第一條路徑。題目測試資料與資料範圍 11 12 1 21 3 1 42 5 3 64 7 5 86 9 7 10 8 11 9 11 10 11 1 4 7 10 11 2 5 8 3 6 9 頂點數與邊數的範圍不定。題目分折 有向無環...