AC日記 最小路徑覆蓋問題 洛谷 P2764

2022-05-14 07:20:43 字數 1749 閱讀 2193

«問題描述:

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

思路:網路流24題之一;

還是那條性質,求最小割;

每條有向邊的u,v加邊都是u,v+n;

求出最大流,ans=n-最大流;

然後,我們在求最大流的時候把匹配的點和邊做標記以輸出路徑;

來,上**:

#include #include 

#include

#include

#include

#define inf 0x7ffffff

using

namespace

std;

struct

edgetype ;

struct edgetype edge[24005

];int if_z,n,m,cnt=1,head[505],s=0,t=504

;int deep[505],next[505

],ans;

bool if_[505

];char

cget;

inline

void

in(int &now)

while(cget>='

0'&&cget<='9'

)

now*=if_z;

}inline

void edge_add(int u,int v,int

w)bool

bfs()

}que.pop();

}return

false;}

int flowing(int now,int

flow)

flow-=pos;

oldflow+=pos;

edge[i].flow-=pos;

edge[i^1].flow+=pos;

if(flow==0) return

oldflow;

}return

oldflow;

}void

dinic()

intmain()

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

dinic();

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

printf("\n

");}

printf(

"%d\n

",ans);

return0;

}

洛谷P2764 最小路徑覆蓋問題

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

洛谷P2764 最小路徑覆蓋

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

最小路徑覆蓋問題(最小路徑覆蓋)

本題題目描述可以發現很明顯的最小路徑覆蓋問題,又因為最小路徑覆蓋 節點數 二分圖最大匹配數,所以本題可以用匈牙利演算法求出二分圖最大匹配數,也可以向第一題那樣用網路流模型求出最大匹配數。本題建模時不同在於,每個點要分成兩個點,乙個為起點,乙個為終點,再來求二分圖最大匹配。然後麻煩就在於本題也要輸出路...