贴一个板子
#include <bits/stdc++.h>
#define ll long long
#define N (ll)(1e3)
#define INF 0x3f3f3f3f
using namespace std;
struct node{
ll t,cap,flow,next; ///cap容量,flow流量
}e[N*N];
int head[N],cur[N],cnt; ///cur优化dfs中的head
void add(int u,int v,ll cap) ///u->v容量为cap
{
e[cnt]=node{v,cap,0,head[u]};
head[u]=cnt++;
e[cnt]=node{u,0,0,head[v]}; ///容量为0的反向边
head[v]=cnt++;
}
int d[N]; ///bfs深度
bool bfs(int s,int t) ///O(n+m)
{
memset(d,0,sizeof(d));
queue<int>q;
q.push(s);
d[s]=1;
while(!q.empty())
{
int u=q.front();q.pop();
for(int i=head[u];~i;i=e[i].next)
{
int v=e[i].t;
if(d[v]==0&&e[i].cap-e[i].flow>0)
{
d[v]=d[u]+1;
q.push(v);
}
}
}
return d[t]>0; ///存在增广路
}
ll dfs(int s,int t,ll minedge)
{
if(s==t)return minedge;
ll flow=0; ///从当前s点流出的流量
for(int &i=cur[s];~i;i=e[i].next)
{
int v=e[i].t;
if(d[v]==d[s]+1&&e[i].cap-e[i].flow>0) ///层次关系&&有剩余流量
{
ll temp=dfs(v,t,min(minedge-flow,e[i].cap-e[i].flow));
e[i].flow+=temp; ///流量增加
e[i^1].flow-=temp; ///反向边流量减少
flow+=temp; ///flow已分配的流量
if(flow==minedge)return flow; ///已达到祖先的最大流,无法再大,剪枝
}
}
if(flow==0)d[s]=0; ///此点已无流,标记掉
return flow;
}
ll dinic(int s,int t) ///一定要建立反向边cap=0
{
ll maxflow=0;
while(bfs(s,t)) ///有增广路
{
memcpy(cur,head,sizeof(head)); ///重要的优化
maxflow+=dfs(s,t,INF);
}
return maxflow;
}
int main()
{
return 0;
}