您的位置:首页 > 其它

最大费用最大流模版(POJ 3422)

2012-05-27 21:34 288 查看
struct edge

{

int num,len,C;

edge *next,*rev;

}*S[nnMax],pool[MMax];

void build(int x,int y,int z,int C)

{

edge *p=&pool[L++],*q=&pool[L++];

p->num=y;p->len=z;p->C=C;p->next=S[x];S[x]=p;p->rev=q;

q->num=x;q->len=0;q->C=-C;q->next=S[y];S[y]=q;q->rev=p;

}

int d[nnMax];

edge *P[nnMax];

bool inq[nnMax];

queue<int> Q;

/**************************************************************************/

int Dinic()

{

int ans=0;

while(1)

{

for(int i=0;i<=nn;i++)

{

d[i]=-1;

inq[i]=0;

P[i]=NULL;

}

while(!Q.empty()) Q.pop();

d[0]=0;inq[0]=1;Q.push(0);

while(!Q.empty())

{

int tmp=Q.front();Q.pop(); inq[tmp]=0;

for(edge *p=S[tmp];p;p=p->next)

{

if(p->len && d[p->num]<d[tmp]+p->C)

{

d[p->num]=d[tmp]+p->C;

P[p->num]=p->rev;

if(!inq[p->num])

{

inq[p->num]=1;

Q.push(p->num);

}

}

}

}

if(d[nn]==-1) break;

int flow=(~0u>>1),tmp=nn;

while(P[tmp]!=NULL)

{

flow=min(flow,P[tmp]->rev->len);

tmp=P[tmp]->num;

}

tmp=nn;

while(P[tmp]!=NULL)

{

P[tmp]->rev->len-=flow;

P[tmp]->len+=flow;

ans+=flow*(P[tmp]->rev->C);

tmp=P[tmp]->num;

}

}

return ans;

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