网络流模板
前言:
自己的DINIC
别人的DINIC
于是决定改掉自己的DINIC。
之前写的是栈模拟dfs
现在参考的是《算法竞赛进阶指南》
Code:
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int N=10010;
const int M=200010;
const int inf=0x3f3f3f3f;
int min(int x,int y){return x<y?x:y;}
int head[N],edge[M],to[M],Next[M],cnt=1;
void add(int u,int v,int w)
{
Next[++cnt]=head[u];to[cnt]=v;edge[cnt]=w;head[u]=cnt;
Next[++cnt]=head[v];to[cnt]=u;edge[cnt]=0;head[v]=cnt;
}
int n,m,s,t;
void init()
{
scanf("%d%d%d%d",&n,&m,&s,&t);
int u,v,w;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
}
}
queue <int > q;
int dep[N];
bool bfs()
{
while(!q.empty()) q.pop();
memset(dep,0,sizeof(dep));
dep[s]=1;
q.push(s);
while(!q.empty())
{
int u=q.front();
q.pop();
for(int i=head[u];i;i=Next[i])
{
int v=to[i];
if(edge[i]&&!dep[v])
{
dep[v]=dep[u]+1;
if(v==t) return 1;
q.push(v);
}
}
}
return 0;
}
int dfs(int now,int flow)
{
if(now==t) return flow;
int rest=flow,k;
for(int i=head[now];i&&rest;i=Next[i])
{
int v=to[i];
if(edge[i]&&dep[v]==dep[now]+1)
{
k=dfs(v,min(edge[i],rest));
if(!k) dep[v]=0;
rest-=k;
edge[i]-=k;
edge[i^1]+=k;
}
}
return flow-rest;
}
void work()
{
int maxflow=0,flow;
while(bfs())
while(flow=dfs(s,inf)) maxflow+=flow;
printf("%d\n",maxflow);
}
int main()
{
init();
work();
return 0;
}