- 最小费用最大流
Code
bool SPFA(int S,int T){
memset(v,0,sizeof(v));
memset(d,0x3f,sizeof(d));
queue<int> q;
q.push(S),d[S]=0,incf[S]=inf,v[S]=1;
while(q.size()){
int x=q.front();q.pop();v[x]=0;
for(int i=lin[x];i;i=e[i].n){
int y=e[i].y;
if(!e[i].v)continue;
if(d[y]>d[x]+e[i].w){
pre[y]=i;
d[y]=d[x]+e[i].w;
incf[y]=min(incf[x],e[i].v);
if(!v[y])v[y]=1,q.push(y);
}
}
}
if(d[T]>1e9)return 0;
return 1;
}
void upd(int S,int T){
int x=T;
while(x!=S){
int i=pre[x];
e[i].v-=incf[T];
e[i^1].v+=incf[T];
x=e[i^1].y;
}
maxflow+=incf[T];
ans+=d[T]*incf[T];
}