hdu 3491 Thieves 最小割拆點

2021-06-19 10:21:03 字數 927 閱讀 4197

題意:有n個城市和m條道路(雙向),一夥小偷準備從s城出發到h城盜竊,為了將這夥小偷抓住,需要在這n個城市中的每乙個城市安排一定數量的警察(每個城市警察的數量已經給出),但警察不希望在s城或h城遇到小偷.求解總共需要的最少警察數.

由於每個城市頂點都具有權值,所以對於每個城市拆成兩個點u和所對應的u',之間連容量為w的邊,s,h兩點不會算在最小割中,所以將這兩點拆點,拆點後容量為無窮,新增源點s和匯點t,加邊(s,s,inf)和(h+n,t,inf),對於兩相連的城市之間連容量為無窮大的雙向邊,然後求解最大流即可.

#include#include#include#include#include#include#include#include#include #include#includeusing namespace std ;

const int n=400 ;

const int m=300000 ;

const int inf=1<<30 ;

struct node

edge[m];

int head[n],gap[n],dis[n],cur[n],pre[n];

int top ;

void add(int u, int v ,int c)

int sap(int s,int t,int n)

{

int flow=0,aug=inf,u;

memset(dis,0,sizeof(dis));

memset(gap,0,sizeof(gap));

for(int i=0; i<=n; i++) cur[i]=head[i];

gap[s]=n;

u=pre[s]=s;

while(dis[s]0&&dis[u]==dis[v]+1)

{if(edge[j].c0&&dis[v]

HDU 3491 Thieves 最小點割集

傳送門 hdu 3491 thieves 題目分析 無向圖建成有向圖 本題這麼簡單竟然還錯了這麼多次。反正就是乙個點x拆成兩個點x,x 建邊,容量為點權。然後有邊 u,v 則建邊 u v v u 容量為無窮大。然後跑最大流就好了。比較坑爹的是題目明明說了輸出換行!但是事實是不用輸出 如下 inclu...

HDU3491最小割拆點

這道題就是乙個最小割,不過由於給出的是點的容量所以採用拆點連邊,這樣就把乙個點拆成連個點然後其邊容量為點容量。之後建圖的時候是雙向邊把拆出的點 i n 連到下個點就好,然後就是最大流。include include include include include using namespace st...

流量最小HDU 3491 最小割

在寫這篇文章之前,已經寫過了幾篇關於改流量最小主題的文章,想要了解的朋友可以去翻一下之前的文章 題意 有n個都會,每乙個都會有定一數量的察警,有一群小偷,從都會s,到t,問起碼須要多少察警可以使小偷到不了t都會。將每乙個都會的察警數量當作流量,那麼題問就轉化成求s t的最小割。將每乙個點拆成i i ...