Dinic模板 O(n*m^2) 由于Dinic是在EK的基础上优化的,所以EK就不贴了
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
#define INF 0x3f3f3f3f
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
const int maxn=10000+50;
const int maxm=1e6+50;
struct node
{
node(){};
node(int tv,int tw,int tnext){v=tv,w=tw,next=tnext;};
int v,w,next;
}e[maxm];
int first[maxn],vis[maxn],dis[maxn],tot;
void add_edge(int u,int v,int w)
{
e[tot]=node(v,w,first[u]);
first[u]=tot++;
}
void add(int u,int v,int w)
{
add_edge(u,v,w);
add_edge(v,u,0);
}
int bfs(int s,int t)
{
mem(vis,0);
mem(dis,0);
queue<int>q;
q.push(s);
vis[s]=1;
while(!q.empty())
{
int u=q.front();
q.pop();
for(int i=first[u];~i;i=e[i].next)
{
if(!vis[e[i].v]&&e[i].w>0)
{
vis[e[i].v]=1;
dis[e[i].v]=dis[u]+1;
q.push(e[i].v);
}
}
}
return dis[t];
}
int dfs(int u,int t,int flow)
{
if(u==t)return flow;
for(int i=first[u];~i;i=e[i].next)
{
if(dis[e[i].v]==dis[u]+1&&e[i].w>0)
{
int dd=dfs(e[i].v,t,min(e[i].w,flow));
if(dd)
{
e[i].w-=dd;
e[i^1].w+=dd;
return dd;
}
}
}
dis[u]=0;
return 0;
}
int Dinic(int s,int t)
{
int ans=0,flow;
while(bfs(s,t))
{
while(flow=dfs(s,t,INF))
ans+=flow;
}
return ans;
}
void init()
{
mem(first,-1);
tot=0;
}
int main()
{
int n,m,s,t,x,y,z;
scanf("%d%d%d%d",&n,&m,&s,&t);
init();
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
}
printf("%d\n",Dinic(s,t));
}
SAP和FF暂且没学,留坑