【算法学习】网络流模板……
网络流最大流(最小割)Dinic模板……
1 const int INF=99999999; 2 const int Maxn=; 3 const int Maxm=; 4 inline int Min(int p,int q){return p<q?p:q;} 5 int n,m,h[Maxn+5],to[Maxm*2+5],cap[Maxm*2+5],nxt[Maxm*2+5],tot=1,Sum=0,que[Maxn+5],l,r,lv[Maxn+5],iter[Maxn+5]; 6 inline void ins(int x,int y,int c){nxt[++tot]=h[x];to[tot]=y;cap[tot]=c;h[x]=tot;} 7 inline void INS(int x,int y,int c){ins(x,y,c);ins(y,x,0);}
1 inline bool lvl() { 2 memset(lv,0,sizeof lv); 3 int u; 4 l=r=1; que[1]=0; lv[0]=1; 5 while(l<=r) { 6 u=que[l++]; 7 eF(i,u) if(!lv[to[i]]&&cap[i]) { 8 lv[to[i]]=lv[u]+1; 9 que[++r]=to[i]; 10 } 11 } 12 return lv[T]; 13 } 14 int flow(int u,int f) { 15 if(u==T) return f; 16 int d,sum=0; 17 for(int&i=iter[u];i;i=nxt[i]) if(lv[to[i]]==lv[u]+1&&cap[i]) { 18 d=flow(to[i],Min(f,cap[i])); 19 sum+=d; f-=d; 20 cap[i]-=d; cap[i^1]+=d; 21 if(!f) return sum; 22 } 23 return sum; 24 } 25 int Dinic() { 26 int ans=0; 27 while(lvl()) { 28 for(int i=0;i<=T;++i) iter[i]=h[i]; 29 ans+=flow(0,INF); 30 } 31 return ans; 32 } 33 int main() { 34 init(); 35 printf("%d",Sum-Dinic()); 36 }
没了……
init自己打 :(
来自 PinkRabbit 的博客园(https://www.cnblogs.com/PinkRabbit/p/7115407.html)。未经允许,请勿转载。