P2764 最小路徑覆蓋問題

2022-05-01 07:12:11 字數 1690 閱讀 6596

«問題描述:

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

«程式設計任務:

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

輸入格式:

件第1 行有2個正整數n和m。n是給定有向無環圖g 的頂點數,m是g 的邊數。接下來的m行,每行有2 個正整數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 #include2 #include3 #include4 #include5 #include6

#define inf 0x3fffffff

7using

namespace

std;

8const

int maxn = 1e5 + 10;9

inthead[maxn], sign, cur[maxn];

10int

s, t, d[maxn];

11struct

node edge[maxn] ;

14void

creat()

18void add(int u, int v, int

w) 28

intbfs() 43}

44}45return d[t] != 0;46

}47int dfs(int top, int

flow ) 60}

61if (ans == 0) return d[top] = 0;62

return

ans;63}

6465

int dinic(int

n) 72

return

ans;73}

74int

n, m, vis[maxn];

75void go(int x, int &f)

84int

main()

95int ans = n -dinic(t);

96for (int i = head[t]; ~i ; i =edge[i].next)

102}

103 printf("

%d\n

", ans);

104return0;

105 }

P2764 最小路徑覆蓋問題

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

P2764 最小路徑覆蓋問題

給定有向圖 g v,e g v,e 設 p 是 g 的乙個簡單路 頂點不相交 的集合。如果 v 中每個定點恰好在p的一條路上,則稱 p 是 g 的乙個路徑覆蓋。p中路徑可以從 v 的任何乙個定點開始,長度也是任意的,特別地,可以為 0 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 從第1 行開始,每行輸出一條路徑。檔...