ZKW費用流 模板
阿新 • • 發佈:2019-01-27
學了這麼多天的zkw費用流,竟然只會最簡單的。。。粘上蒟蒻的模板吧。
bool spfa(){ memset(vis,0,sizeof(vis)); for(int i=0;i<=T;i++)dep[i]=-1; int head=0,tail=1; dep[T]=0; vis[T]=1; q[head]=T; while(head!=tail){ int u=q[head]; head++; if(head==maxn)head=0;//這個maxn以題而論 for(int i=head[u];i!=-1;i=e[i].next){//head陣列好像與head重名了,這個你們自己看到辦吧。 int v=e[i].v; if(e[i^1].c&&dep[v]<dep[u]+e[i^1].w){ dep[v]=dep[u]+e[i^1].w; if(vis[v]==0){ vis[v]=1; q[tail++]=v; if(tail==maxn)tail=0; } } } vis[u]=0; } return dep[S]!=-1; } int dfs(int a,int b){ vis[a]=1; if(a==T)return b; int ret=0; for(int i=head[a];i!=-1;i=e[i].next){ int v=e[i].v; if(dep[v]==dep[u]-e[i].w&&e[i].c){ int x=dfs(v,min(b-ret,e[i].c)); e[i].c-=x; e[i^1].c+=x; ans+=x*e[i].w; ret+=x; if(ret==b)return b; } } return ret; } void zkw(){ while(spfa()){ vis[T]=1; while(vis[T]){ memset(vis,0,sizeof(vis)); dfs(s,inf); } } }