网络流模板.docx
《网络流模板.docx》由会员分享,可在线阅读,更多相关《网络流模板.docx(20页珍藏版)》请在冰豆网上搜索。
网络流模板
<网络流>
最大流:
Ford&Fulkerson算法
#include
#include
#include
usingnamespacestd;
constintmaxint=100000000;
#defineMAX410
intn,m;
intcap[MAX][MAX],prev[MAX],s,t,flow[MAX][MAX];
intfind()
{
intQ[MAX],head=0,tail=0;;
memset(prev,-1,sizeof(prev));
Q[tail++]=s;
prev[s]=s;
while(head{
intp=Q[head++];
for(inti=1;i<=n;i++)
{
if(prev[i]==-1&&cap[p][i]-flow[p][i]>0)
{
prev[i]=p;
if(i==t)
return1;
Q[tail++]=i;
}
}
}
return0;
}
intmaxflow()
{
intex,i,ret=0;
while(find())
{
ex=maxint;
for(i=t;i!
=s;i=prev[i])
{
if(ex>cap[prev[i]][i]-flow[prev[i]][i])
ex=cap[prev[i]][i]-flow[prev[i]][i];
}
for(i=t;i!
=s;i=prev[i])
{
flow[prev[i]][i]+=ex;
flow[i][prev[i]]-=ex;
}
ret+=ex;
}
returnret;
}
最大流:
Dinic算法
#include
#include
usingnamespacestd;
#defineMAXN20010
#defineinf0x7fffffff
structnode{
intnext,c,f,other;
}N;
vectormap[MAXN];//原图
vectorlever_map[MAXN];//层次图
intque[MAXN*1],lever[MAXN],pre[MAXN],hash[MAXN],d[MAXN];
ints,t;
voidinit(){
inti;
for(i=s;i<=t;i++){
map[i].clear();
}
}
voidadd(intu,intv,intc){
N.next=v;N.c=c;N.other=map[v].size();N.f=0;
map[u].push_back(N);
N.next=u;N.c=0;N.other=map[u].size()-1;N.f=0;
map[v].push_back(N);
}
boolbulid(){
inthead=0,tail=0,cur,next,i,j;
for(i=s;i<=t;i++)lever_map[i].clear();
memset(lever,-1,sizeof(lever));
que[tail++]=s;
lever[s]=0;
while(headcur=que[head++];
for(i=0;i