洛谷 P2764 最小路徑覆蓋 節點數 最大匹配

2022-03-03 08:22:50 字數 2024 閱讀 2900

每條邊的容量均為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<=n<=150,1<=m<=6000

由@flierking提供spj

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8

using

namespace

std;

9#define inf 0x3f3f3f3f

10const

int maxn = 6e4+10;11

intn,m,s,t,u,v;

12struct

edge ;

15 vectoredges;

16 vectorg[maxn];

17bool

vis[maxn];

18int

d[maxn], cur[maxn],nxt[maxn];

1920

void

init()

2125

26void addedge(int

from, int to, int

cap)

27);

29 edges.push_back((edge));

30int m =edges.size();

31 g[from].push_back(m-2); g[to].push_back(m-1

);32}33

34bool

bfs()

3552}53

}54return

vis[t];55}

5657

int dfs(int x,int

a) 5871}

72return

flow;73}

7475

int maxflow(int s, int

t) 76

83return

flow;84}

8586

intmain()

8796 s=0,t=2*n+1;97

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

98102

int ans=maxflow(s,t);

103 memset(nxt,0,sizeof

nxt);

104 memset(vis,0,sizeof

vis);

105106

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

107113

}114

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

115127 printf("\n"

);128

}129

}130 printf("

%d\n

",n-ans);

131}

132return

0;

133 }

view code

洛谷P2764 最小路徑覆蓋

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

洛谷P2764 最小路徑覆蓋問題

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

P2764 最小路徑覆蓋

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