在 dfs 的增广中,不要忘记除了判断 dis[v]==dis[u]+w 之外,还要判断路径长度。
like this:
inline bool SPFA(){
for(int i=1;i<=cnt*2+2;i++)d[i]=INT_MIN;
while(q.size())q.pop();
f&=0,d[st]=0,cur[st]=h[st],q.push(st);
while(q.size()){
int u=q.front();q.pop(),f[u]=0;
for(int i=h[u];i;i=edge[i].nxt){
int v=edge[i].to,c=edge[i].c,w=edge[i].w;
if(c&&d[v]<d[u]+w){
d[v]=d[u]+w,l[v]=l[u]+1,cur[v]=h[v];
if(!f[v])q.push(v),f[v]=1;
}
}
}
return d[ed]!=INT_MIN;
}
int dfs(int u,int flow){
if(u==ed)return flow;
int tmp=flow;
for(int i=cur[u];i&&tmp;i=edge[i].nxt){
cur[u]=i;
int v=edge[i].to,c=edge[i].c,w=edge[i].w;
if(c&&d[v]==d[u]+w&&l[v]==l[u]+1){
int k=dfs(v,min(tmp,c));
if(!k)d[v]=INT_MIN;
edge[i].c-=k,edge[i^1].c+=k,tmp-=k,mx_cost+=w*k;
}
}
return flow-tmp;
}