void addedge(int u,int v,int c,int w)
{
e[cnt].v=v;
e[cnt].c=c;
e[cnt].w=w;
e[cnt].next=head[u];
head[u]=cnt++;
e[cnt].v=u;
e[cnt].c=0;
e[cnt].w=-w;
e[cnt].next=head[v];
head[v]=cnt++;
}
int dis[100010];
bool vis[1010];
int pre[100010];
int pos[100010];
int mcmf()
{
int ans=0; int maxflow=0;
while(1){
for(int i=0;i<=T;i++) dis[i]=inf,vis[i]=0,pre[i]=i,pos[i]=0;
queue<int> q;
dis[S]=0;
q.push(S);
vis[S]=1;
int u,v,w,c;
while(!q.empty())
{
u=q.front();
q.pop();
vis[u]=0;
for(int i=head[u];i!=-1;i=e[i].next)
{
v=e[i].v;
if(e[i].c>0&&dis[v]>dis[u]+e[i].w)
{
pre[v]=u;
pos[v]=i;
dis[v]=dis[u]+e[i].w;
if(!vis[v])
{
vis[v]=1;
q.push(v);
}
}
}
}
if(dis[T]==inf) break;
int sum=inf;
for(u=T;u!=S;u=pre[u])
{
c=e[pos[u]].c;
sum=min(sum,c);
}
maxflow+=sum;
for(u=T;u!=S;u=pre[u])
{
e[pos[u]].c-=sum;
e[pos[u]^1].c+=sum;
ans+=sum*e[pos[u]].w;
}
}
return ans;
}
费用流 模板
最新推荐文章于 2024-06-27 10:00:00 发布