网络流Dinic模板

 1 #define INF 2000000000
 2 #define typec int//type of cost
 3 const int pN=600000,eN=3000000;
 4 struct Edge{
 5     int u,v,next;
 6     typec w;
 7 };
 8 Edge edge[eN];
 9 int en,head[pN],cur[pN],ps[pN],dep[pN];
10 void insert(int u,int v,typec w){
11     edge[en].u=u;
12     edge[en].v=v;
13     edge[en].w=w;
14     edge[en].next=head[u];
15     head[u]=en++;
16     edge[en].u=v;
17     edge[en].v=u;
18     edge[en].w=0;//有向为0,无向为w
19     edge[en].next=head[v];
20     head[v]=en++;
21 }
22 typec max_flow(int n,int s,int t){
23     typec tr,res=0;
24     int i,j,k,f,r,top;
25     while(1){
26         memset(dep,-1,n*sizeof(int));
27         for(f=dep[ps[0]=s]=0,r=1;f!=r;)
28             for(i=ps[f++],j=head[i];j!=-1;j=edge[j].next){
29                 if(edge[j].w&&-1==dep[k=edge[j].v]){
30                     dep[k]=dep[i]+1;
31                     ps[r++]=k;
32                     if(k==t){
33                         f=r;
34                         break;
35                     }
36                 }
37             }
38             if(-1==dep[t])break;
39             memcpy(cur,head,n*sizeof(int));
40             for(i=s,top=0;;){
41                 if(i==t){
42                     for(k=0,tr=INF;k<top;++k)
43                         if(edge[ps[k]].w<tr)
44                             tr=edge[ps[f=k]].w;
45                         for(k=0;k<top;++k)
46                             edge[ps[k]].w-=tr,edge[ps[k]^1].w+=tr;
47                         res+=tr;
48                         i=edge[ps[top=f]].u;
49                 }
50                 for(j=cur[i];cur[i]!=-1;j=cur[i]=edge[cur[i]].next)
51                     if(edge[j].w&&dep[i]+1==dep[edge[j].v])break;
52                     if(cur[i]!=-1){
53                         ps[top++]=cur[i];
54                         i=edge[cur[i]].v;
55                     }else{
56                         if(0==top)break;
57                         dep[i]=-1;
58                         i=edge[ps[--top]].u;
59                     }
60             }
61     }
62     return res;
63 }

posted on 2012-08-13 20:57  acoderworld  阅读(73)  评论(0)    收藏  举报

导航