zoukankan      html  css  js  c++  java
  • 最小费用最大流邻接表模板

    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;
    }


    
    
    
  • 相关阅读:
    CF
    求最长反链 || Dilworth 定理
    APIO 2020 补题记录
    CF vp 记录
    虚树
    LCT 学习
    平衡树
    poly
    关于此博客
    题解 P5021【NOIP2018】 【赛道修建】
  • 原文地址:https://www.cnblogs.com/thefirstfeeling/p/4410663.html
Copyright © 2011-2022 走看看