題意:有乙個矩形城市,座標為整數的的點為路口,之間的連線為街道,現在有b個銀行要被搶劫,能不能在經過每個路口至多一次的情況下,劫匪能逃到城市邊緣
思路:網路流。建立乙個源點s和乙個匯點t。將n*m個點的每個點a拆成兩個點a1和a2且a1向a2連一條邊。如果點a處是銀行那麼s與a1連一條邊,如果b與a相鄰,那麼a2與b1連一條邊,對於所有的邊界點c,c2與匯點t連一條邊,所有的邊的容量都是1,最後做網路流,如果最大流量等於k就可行,否則不可行。
下面是**:
#include#include#include#includeusing namespace std;
const int maxn=50010;
const int inf=1000000000;
int n,m,b;
struct node
edge[500010];
int head[maxn],pre[maxn],gap[maxn],dis[maxn],cur[maxn];
int num,nn;
void init()
void add_edge(int x,int y,int f)
void add_adjcant(int x,int y)
if(x1)
if(y0&&dis[u]==dis[v]+1)
aug=inf;
}break;}}
if(flag)continue;
int mindis=nn;
for(int j=head[u];j!=-1;j=edge[j].next)
}if((--gap[dis[u]])==0)break;
gap[dis[u]=mindis+1]++;
u=pre[u];
}return flow;
}int main()
}for(int i=1;i<=m;i++)
for(int i=2;i
網路流最小割(拆點)
具體思路 網路流的最小割等於玩網路流的最大流量,注意拆點,以及拆點後邊連的時候是拆點後第二個點連向目的地。ac include include include includeusing namespace std const int maxn 100010 點數的最大值 const int maxm...
網路流 拆點 最小割點集
byteland 國 收到了一條匿名舉報,其中說當地黑幫老大正計畫一次從港口到郊區倉庫的運輸。知道運輸的時間並且知道運輸需要用到國家的高速公路網。高速公路網包含雙向的高速公路段,每個路段直接連著兩個不同的收費站。乙個收費站可能與很多其他的收費站相連。汽車只能通過收費站進入或離開高速公路網。據所知,黑...
Dining POJ 3281 (拆點網路流)
題意 n 頭牛,f 種食物 食物只有乙份 d 種飲料 飲料只有乙份 然後每頭牛喜歡哪些食物,哪些飲料。每頭牛只有喝了自己喜歡喝的飲料,吃了自己喜歡吃的食物才會開心 問最多能讓多少頭牛開心。思路 1 最大流模板,新增 源點 和 匯點 2 但是存在問題,每個牛可能會吃多種食物,喝多種飲料,怎麼能這種情況...