网络流——SAP模板
//网络流SAP模板,复杂度O(N^2*M) //使用前调用init(源点,汇点,图中点的个数),然后调用add_edge()加边 //调用getflow得出最大流 #define N 55 #define M 500500 #define INF 0x3fffff struct Max_Flow { struct node { int to,w,next; }edge[M]; int s,t; int nn; int cnt,pre[N]; int lv[N],gap[N]; void init(int ss,int tt,int num) { s=ss; t=tt; nn = num;// cnt=0; memset(pre,-1,sizeof(pre)); } void add_edge(int u,int v,int w)//同时建两条边 { edge[cnt].to=v; edge[cnt].w=w; edge[cnt].next=pre[u]; pre[u]=cnt++; edge[cnt].to=u; edge[cnt].w=0; edge[cnt].next=pre[v]; pre[v]=cnt++; } int sdfs(int k,int w) { if(k==t) return w; int f=0; int mi=nn-1; for(int p=pre[k];p!=-1;p=edge[p].next) { int v=edge[p].to,tw=edge[p].w; if(tw!=0) { if(lv[k]==lv[v]+1) { int tmp=sdfs(v,min(tw,w-f)); f+=tmp; edge[p].w-=tmp; edge[p^1].w+=tmp; if(f==w||lv[s]==nn) break; } if(lv[v]<mi) mi=lv[v]; } } if(f==0) { gap[lv[k]]--; if( gap[ lv[k] ]==0 ) { lv[s]=nn; } lv[k]=mi+1; gap[lv[k]]++; } return f; } int getflow() { int sum=0; memset(lv,0,sizeof(lv)); memset(gap,0,sizeof(gap)); gap[0]=nn; while(lv[s]<nn) { sum+=sdfs(s,INF); } return sum; } };