網路流24題 最小路徑覆蓋問題(最小割模型)

2021-08-28 06:53:51 字數 1824 閱讀 4334

«問題描述:

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

對於乙個路徑覆蓋,有如下概念:

①:每個頂點只屬於乙個路徑;

②:路徑上除終點外,從每個頂點出發只有一條邊指向路徑上的另一頂點。

將所有點拆成功入點和出點,源點連所有入點,匯點連所有出點,所有邊容量都為1,而對於每個邊u-v來說,只連

u的入點和v的出點,這樣保證了每個點至少會走一次。最後還原路徑,對於每個起點,每次走與他相連且殘留量為0

的點並標記。

最小路徑覆蓋數=頂點數-二分最大匹配數

#pragma gcc optimize(2)

#include#include#include#includeusing namespace std;

const int maxn = 1e5;

const int inf = 0x3f3f3f3f;

typedef long long ll;

int head[maxn], level[maxn];

int n, m, tot;

struct node

edge[maxn];

void addedge(int u, int v, int w)

bool bfs(int s, int t)

} }return level[t] != 0;

}int dfs(int s, int t, int f)

int cost = 0;

for (int i = head[s]; i != -1; i = edge[i].next)

}else

}} return cost;

}int dinic(int s, int t)

return flow;

}int main()

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

int sum = n - dinic(s, t);

int vis[maxn];

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

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

int flag = 0, now = i;

while (1)

}if (!flag)

}printf("\n");

} printf("%d\n", sum);

} return 0;

}

網路流24題 最小路徑覆蓋 (最小路徑覆蓋)

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

網路流24題 最小路徑覆蓋問題

有向無環圖最小路徑覆蓋,可以轉化成二分圖最大匹配問題,從而用最大流解決。構造二分圖,把原圖每個頂點i拆分成二分圖x,y集合中的兩個頂點xi和yi。對於原圖中存在的每條邊 i,j 在二分圖中連線邊 xi,yj 然後把二分圖最大匹配模型轉化為網路流模型,求網路最大流。最小路徑覆蓋的條數,就是原圖頂點數,...

最小路徑覆蓋問題(網路流24題)

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