luogu2764 最小路徑覆蓋問題

2022-09-08 00:06:30 字數 1486 閱讀 6847

«問題描述:

每條邊的容量均為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 2

1 3

1 4

2 5

3 6

4 7

5 8

6 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

這道題啊,就是裸題啊,二分圖的構建如下:

唯一需要注意的就是,在輸出路徑時,

需要記錄一下這個點的增廣是向哪乙個點進行的,在輸出時注意處理一下點的編號就好了

這裡寫**片

//最小路徑覆蓋的條數,就是原圖頂點數,減去二分圖最大匹配數。

#include

#include

#include

#include

using

namespace

std;

const

int inf=0x33333333;

const

int n=12010;

int n,m;

struct node;

node way[n];

int ans=0,st[n],s,t,tot=-1,deep[n];

bool p[n];

int last[n];

void add(int u,int v,int z)

int bfs()}}

return !p[t];

}int dfs(int now,int t,int limit)

}return flow;

}void doit()

void solve() //輸出路徑

printf("\n");}}

}return;

}int main()

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

doit();

solve();

printf("%d",n-ans);

return

0;}

P2764 最小路徑覆蓋

我們首先將原圖用n條路徑覆蓋,每條邊只經過乙個節點 本身 可以知道每合併兩條路徑,路徑覆蓋數就會減少1。現在盡量合併更多的路徑 即將兩個路徑通過一條邊首尾相連 所以拆點做二分圖最大匹配即可。includeusing namespace std const int maxn 510 const int...

Luogu P2764 最小路徑覆蓋問題

洛谷傳送門 給定有向圖g v,e g v,e 設p p 是g role presentation style position relative g g的乙個簡單路 頂點不相交 的集合。如果 v v 中每個頂點恰好在 p role presentation style position relati...

P2764 最小路徑覆蓋問題

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