网络流&费用流模板
网络流&费用流模板##
最大流
struct edge{
int to,val,next;
}e[];
int cnt_edge,last[],cur[],dis[];
inline void add_edge(int u,int v,int w){
e[++cnt_edge]=(edge){v,w,last[u]};last[u]=cnt_edge;
e[++cnt_edge]=(edge){u,0,last[v]};last[v]=cnt_edge;
}
bool bfs(){
queue<int> Q;
for(int i=S;i<=T;i++) dis[i]=-1;
Q.push(S);dis[S]=0;
while(!Q.empty()){
int now=Q.front();Q.pop();
for(int i=last[now];i!=-1;i=e[i].next)
if(e[i].val && dis[e[i].to]==-1){
dis[e[i].to]=dis[now]+1;
Q.push(e[i].to);
}
}
return dis[T]!=-1;
}
int dfs(int u,int flow){
if(u==T) return flow;
int used=0;
for(int i=cur[u];i!=-1;i=e[i].next)
if(dis[e[i].to]==dis[u]+1){
int tot=dfs(e[i].to,min(flow-used,e[i].val));
e[i].val-=tot;e[i^1].val+=tot;
if(e[i].val)cur[u]=i;
used+=tot;
if(used==flow) return flow;
}
if(!used)dis[u]=-1;
return used;
}
int dinic(){
int ans=0;
while(bfs()){
memcpy(cur,last,sizeof(cur));
//for(int i=S;i<=T;i++) cur[i]=last[i];
ans+=dfs(S,inf);
}
return ans;
}
作者:skl_win
出处:https://www.cnblogs.com/shaokele/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。