P2764 最小路徑覆蓋問題

2022-05-16 01:08:50 字數 1185 閱讀 5870

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

輸入輸出格式

輸入格式:

第一行有 2 個正整數 n 和 m 。 nn 是給定gap(有向無環圖) g的頂點數, m 是 g 的邊數。接下來的 m 行,每行有兩個正整數 i 和 j 表示一條有向邊 (i,j)(i,j)。

輸出格式:

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

演算法:把原圖的每個點v拆成\(vx\)和\(vy\)兩個點,如果有一條有向邊a->b,那麼就加邊

\(ax\)−>\(by\)

\(ax\)−>\(by\)。

這樣就得到了乙個二分圖。那麼最小路徑覆蓋=原圖的結點數-新圖的最大匹配數。

#include#define inf 1<<30

using namespace std;

const int maxn=300+50,maxm=12000+10;

int head[maxn],succ[maxn];

bool vis[maxn];

int n,m;

int s,t;

int size=1;

struct edge

e[maxm];

inline int read()

while(ch<='9'&&ch>='0')

return x*f;

}void addedge(int u,int v,int val)

int dfs(int u,int f)}}

return 0;

}int maxflow()

}int main()

int flow=maxflow();

memset(vis,0,sizeof(vis));

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

printf("\n");} }

printf("%d\n",n-flow);

return 0;

}

P2764 最小路徑覆蓋問題

我做24題的第六題,輸出路徑還是有點糊塗 給定有向圖g v,e 設p是圖g上若干點不相交的簡單路徑的集合,若每個點v屬於v都存在於唯一一條p中的路徑上,則p是g的一條路徑覆蓋。路徑數量最少的路徑覆蓋稱為最小路徑覆蓋。用minpc 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 輸出...

P2764 最小路徑覆蓋問題

每條邊的容量均為1。求網路g1的 0 x 0 y 最大流。對於給定的給定有向無環圖g,程式設計找出g的乙個最小路徑覆蓋。檔案第1 行有2個正整數n和m。n是給定有向無環圖g 的頂點數,m是g 的邊數。接下來的m行,每行有2 個正整數i和j,表示一條有向邊 i,j 從第1 行開始,每行輸出一條路徑。檔...