最小费用最大流MCMF 最小增广

没有写单纯性的。。。应该不会有卡最小增广的出题人吧。。。(雾)

 1 struct MCMF{
 2     struct tedge{int x,y,cap,flow,w,next;}adj[maxm];int ms,fch[maxn];
 3     int n,m,d[maxn],p[maxn],a[maxn];bool inq[maxn];
 4     void init(int n){
 5         this->n=n;ms=0;
 6         memset(fch,-1,sizeof(fch));
 7         return;
 8     }
 9     void addedge(int u,int v,int z,int w){
10         adj[ms]=(tedge){u,v,z,0,w,fch[u]};fch[u]=ms++;
11         adj[ms]=(tedge){v,u,0,0,-w,fch[v]};fch[v]=ms++;
12         return;
13     }
14     bool spfa(int S,int T,int& flow,int& cost){
15         queue<int>Q;
16         memset(inq,false,sizeof(inq));
17         for(int i=1;i<=n;i++) d[i]=inf;
18         inq[S]=true;d[S]=0;a[S]=inf;Q.push(S);
19         while(!Q.empty()){
20             int u=Q.front();Q.pop();inq[u]=false;
21             for(int i=fch[u];i!=-1;i=adj[i].next){
22                 int v=adj[i].y;
23                 if(adj[i].cap>adj[i].flow&&d[v]>d[u]+adj[i].w){
24                     d[v]=d[u]+adj[i].w;
25                     a[v]=min(a[u],adj[i].cap-adj[i].flow);
26                     p[v]=i;
27                     if(!inq[v]) inq[v]=true,Q.push(v);
28                 }
29             }
30         } if(d[T]==inf) return false;
31         flow+=a[T];cost+=a[T]*d[T];
32         int x=T;
33         while(x!=S){
34             adj[p[x]].flow+=a[T];
35             adj[p[x]^1].flow-=a[T];
36             x=adj[p[x]].x;
37         } return true;
38     }
39     int solve(int S,int T){
40         int flow=0,cost=0;
41         while(spfa(S,T,flow,cost));
42         return cost;
43     }
44 }sol;
原文地址:https://www.cnblogs.com/chxer/p/4531721.html