【算法学习】网络流模板……

网络流最大流(最小割)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自己打 :(

posted @ 2017-07-04 10:34  粉兔  阅读(330)  评论(0编辑  收藏  举报