学了这么多天的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);
}
}
}

被折叠的 条评论
为什么被折叠?



