您的位置:首页 > 理论基础 > 计算机网络

[BZOJ1834][ZJOI2010]network 网络扩容

2015-07-20 18:03 537 查看
原题地址

最大流+最小费用流.

AC code:

#include <cstdio>
const int N=10010;
const int M=50010;
const int INF=1<<28;
int  n,m,k,S,T,cnt=1,he,ta,mcf,mcost;
int  head
,Q
,d
,cur
,mina
,last
,num
,minf
;
bool inq
;

struct Edge{
int v,f,a,next;

Edge() {}
Edge(int v,int f,int a,int next):v(v),f(f),a(a),next(next) {}
}E[M];

int Min(int x,int y){
return x<y?x:y;
}

void addedge(int u,int v,int c,int a){
E[++cnt]=Edge(v,c,a,head[u]);
E[++cnt]=Edge(u,0,-a,head[v]);
head[u]=cnt-1;head[v]=cnt;
}

void read(){
scanf("%d%d%d",&n,&m,&k);
S=1;T=n;
for(int i=1;i<=m;i++){
int u,v,c,a;
scanf("%d%d%d%d",&u,&v,&c,&a);
addedge(u,v,c,a);
}
}

int BFS(){
he=0;ta=1;Q[0]=S;
for(int i=1;i<=T;i++){
d[i]=0;cur[i]=head[i];
}
while(he!=ta){
int x=Q[he++];
if(he==1001) he=0;
for(int i=head[x];i;i=E[i].next){
Edge e=E[i];
if(e.v==S||d[e.v]||(!e.f)) continue;
d[e.v]=d[x]+1;
Q[ta++]=e.v;
if(ta==1001) ta=0;
}
}
return d[T];
}

int DFS(int x,int a){
if(x==T||(!a)) return a;
int flow,tag=0;
for(int &i=cur[x];i;i=E[i].next){
Edge e=E[i];
if(d[x]+1!=d[e.v]||(!e.f)) continue;
flow=DFS(e.v,Min(a-tag,e.f));
tag+=flow;
E[i].f-=flow;
E[i^1].f+=flow;
if(!(a-tag)) break;
}
return tag;
}

void Dinic(){
int mxf=0;
while(BFS()) mxf+=DFS(S,INF);
printf("%d ",mxf);
}

bool SPFA(){
he=ta=0;Q[0]=S;minf[S]=INF;
for(int i=2;i<=T;i++) mina[i]=INF;
while(he!=ta+1){
int x=Q[he++];
inq[x]=0;
if(he==1001) he=0;
for(int i=head[x];i;i=E[i].next){
Edge e=E[i];
if(e.v==S||(!e.f)||mina[x]+e.a>=mina[e.v]) continue;
num[e.v]=i;
last[e.v]=x;
mina[e.v]=mina[x]+e.a;
minf[e.v]=Min(minf[x],e.f);
if(!inq[e.v]){
inq[e.v]=1;
Q[++ta]=e.v;
if(ta==1001) ta=0;
}
}
}
if(mcf+minf[T]>=k){
mcost+=mina[T]*(k-mcf);
return 0;
}
for(int i=T;i!=S;i=last[i]) E[num[i]].f-=minf[T];
mcf+=minf[T];mcost+=mina[T]*minf[T];
return 1;
}

int main(){
read();
Dinic();
for(int i=1;i<=T;i++){
for(int j=head[i];j;j=E[j].next){
if(E[j].a>0){
if(E[j].f) addedge(i,E[j].v,E[j].f,0);
E[j].f=INF;
}
else E[j].a=0;
}
}
while(SPFA());
printf("%d",mcost);

return 0;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: