版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cys460714380/article/details/82535094
Dinic最大流+弧优化
int head[maxn];
struct node
{
int u,v,cap,nt;
node() {}
node(int u,int v,int cap,int nt):u(u),v(v),cap(cap),nt(nt) {}
} edge[maxm];
int cnt;
void addedge(int u,int v,int cap)
{
edge[cnt] = node(u,v,cap,head[u]);head[u] = cnt++;
edge[cnt] = node(v,u,0,head[v]);head[v] = cnt++;
}
int dis[maxn];int cur[maxn];
bool bfs(int s,int t)
{
mst(dis,-1);
queue<int>q;
dis[s] = 0;
q.push(s);
while(!q.empty())
{
int u = q.front();
q.pop();
for(int i=head[u]; ~i; i=edge[i].nt)
{
node no = edge[i];
int v = no.v;
int cap = no.cap;
if(cap>0&&dis[v]==-1)
{
dis[v]=dis[u]+1;
q.push(v);
}
}
}
return dis[t]!=-1;
}
int dfs(int u,int mx,int t)
{
if(u==t)return mx;
int used = 0;
for(int i = cur[u]; ~i; i = edge[i].nt)
{
cur[u] = i;
node &no = edge[i];
int v = no.v;
int cap = no.cap;
if(dis[v]==dis[u]+1&&cap>0)
{
int w = mx - used;
int flow = dfs(v,min(w,cap),t);
edge[i].cap-=flow;
edge[i^1].cap+=flow;
used+=flow;
if(used==mx)return used;
}
}
if(!used)dis[u] = -1;
return used;
}
int dinic(int s,int t,int tot)
{
int ans = 0;
while(bfs(s,t))
{
int flow;
r0(i,tot)cur[i] = head[i];
while(flow = dfs(s,inf,t))
ans += flow;
}
return ans;
}