网络流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) 收藏 举报
浙公网安备 33010602011771号