網路流 拆點 最小割點集

2022-07-01 11:39:15 字數 2038 閱讀 4543

byteland 國**收到了一條匿名舉報,其中說當地黑幫老大正計畫一次從港口到郊區倉庫的運輸。**知道運輸的時間並且知道運輸需要用到國家的高速公路網。

高速公路網包含雙向的高速公路段,每個路段直接連著兩個不同的收費站。乙個收費站可能與很多其他的收費站相連。汽車只能通過收費站進入或離開高速公路網。據所知,黑幫會距港口邊最近的收費站進入高速公路,從距倉庫最近的收費站離開(不會在出高速後重新進入)。特警組位於選定的收費站處。當運輸車輛進入被監控的收費站時,它就會被警察抓住。

從這個角度看,最簡單的辦法就是在每個收費站處都安排特警班。然而,控制乙個收費站需要特定的費用,每個收費站費用不同。**想要讓花費最小,所以他們需要制定乙個收費站的最小控制集,這個集合滿足兩個條件:

所有從港口到倉庫的交通必須至少經過集合中的乙個收費站

監控這些收費站的費用(即監控每乙個收費站費用之和)最小

你可以假設使用高速公路可以從港口到倉庫。

任務寫乙個程式能夠:

從標準輸入中讀取高速公路網,監控代價和運輸的起點和終點

找到收費站的最小控制集

輸出這個集合到標準輸出

標準輸入的第一行包含兩個整數 n 和 m,表示收費站的總數和公路段的總數。收費站按 1 到 n 標號;

第二行包含兩個整數 a 和 b,分別表示距港口和倉庫最近的兩個收費站編號;

接下來 n 行表示控制費用,第 i 行包含乙個整數,表示第 i 個收費站的控制費用 c;

接下來 m 行表示高速公路網,第 j 行包含兩個整數 x 和 y,表示在 x 和 y 收費站之間有一條公路段相連。每一條高速公路段只出現一次。

唯一的一行輸出應包含最小控制集中收費站的編號,以遞增順序輸出,用乙個空格分隔。

如果有多於乙個最小控制集,你的程式可以輸出任意乙個。

5 65 324

83101 5

1 22 4

4 52 3

3 41 4

拆點之後。把費用當流量,就是最小割。

我們在殘餘網路dfs。不經過滿流的邊,那麼如果乙個點拆的2個點乙個在s集合。乙個在t集合。那麼這個點就是選擇的。因為源匯可以拆

我們應該建立虛的源匯。

#includeusing namespace std;

const int maxn = 2e5 + 10;

const int maxm= 1e6+ 10;

const int inf = 0x3f3f3f3f;

//注釋為弧優化

struct max_folw edge[maxm << 1];

int head[maxn];

bool vis[maxn];

int cnt;

void init(int s, int t)

void add(int start, int to, int cap) ;

head[start] = cnt++;

}void addedge(int start, int to, int cap)

bool bfs()

}thead++;

}return false;//匯點是否成功標號,也就是說是否找到增廣路

}int dfs(int x, int cap)

}d[x] = -2;//防止重搜

return flow;

}int maxflow()

return flow;

}//得到割點集合

queueq;

void bfs()}}

}}flow;

//edge[i].cap-edge[i].flow==0 容量-流量=可流的流量 =0說明已經滿流

int a[maxn];

setst;

int main()

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

flow.maxflow();

flow.bfs();

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

}for(auto x: st)

printf("\n");

return 0;

}

網路流最小割(拆點)

具體思路 網路流的最小割等於玩網路流的最大流量,注意拆點,以及拆點後邊連的時候是拆點後第二個點連向目的地。ac include include include includeusing namespace std const int maxn 100010 點數的最大值 const int maxm...

poj Friendship 最小割 拆點

題意 在乙個關係網中,如果說a與b保持聯絡,那麼a應該知道b的 號碼。或者存在c,a知道c的 號碼,c知道b的 號碼。可以認為如果a知道b的 號碼,那麼b也知道a的 號碼。在乙個關係網中可能會出現一些意外事故,比如某人更換手機號碼了,導致他與其他人都失去了聯絡。問給定兩個人s和t,問,最少多少人出現...

Food 割點 網路流

food food hdu 4292 題面 每個人有多個喜歡的食物和飲料,每個人只能挑一種食物和飲料,問最大能滿足多少人 解法 割點 吧人分成兩部分,中間用邊權為1的線連線,這樣保證每個人只能挑一種食物和飲料 建圖 原點 食物 人1 人2 飲料 匯點 開始跑最大流 include include i...