标签:
没有写单纯性的。。。应该不会有卡最小增广的出题人吧。。。(雾)
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;
标签:
原文地址:http://www.cnblogs.com/chxer/p/4531721.html