最小费用最大流邻接表模板

int dis[N],pre[N],head[N],visit[N],yong;
void init() {
memset(head,-1,sizeof(head));
yong=0;
}
void build(int u,int v,int w,int f) {
	bian[yong].u=u;
	bian[yong].v=v;
	bian[yong].w=w;
	bian[yong].f=f;
	bian[yong].next=head[u];
	head[u]=yong++;
}
void adde(int u,int v,int w,int f) {
	build(u,v,w,f);
	build(v,u,-w,0);
}
int spfa(int s,int t) {
	memset(visit,0,sizeof(visit));
	memset(pre,-1,sizeof(pre));
	for(int i=0;i<=t;i++)//注意是从0开始而不是从s开始
		dis[i]=inf;
	queue<int>q;
	 visit[s]=1;//必须是s
	 q.push(s);
	 dis[s]=0;
	 while(!q.empty ()) {
		 int u=q.front ();
		 for(int index=head[u];index!=-1;index=bian[index].next) {
			 int v=bian[index].v;
			 if(bian[index].f&&dis[v]>dis[u]+bian[index].w) {
				 dis[v]=dis[u]+bian[index].w;
				 pre[v]=index;
				 if(!visit[v]) {
					 visit[v]=1;
					 q.push (v);
				 }
			 }
		 }
		 q.pop();
		 visit[u]=0;//是u
	 }
	 if(dis[t]==inf)
		 return -1;
	 return dis[t];
}
int min_cost(int s,int t) {
   int sum=0,k,i;
   while((k=spfa(s,t))!=-1){
    int minn=inf;
    i=pre[t];
    while(i!=-1) {
        if(minn>bian[i].f)
            minn=bian[i].f;
        i=pre[bian[i].u];
    }
    sum=sum+minn*k;
    i=pre[t];
    while(i!=-1){
        bian[i].f-=minn;
        bian[i^1].f+=minn;
        i=pre[bian[i].u];
    }
   }
   return sum;
}




posted @ 2014-08-04 17:22  HYDhyd  阅读(127)  评论(0编辑  收藏  举报