网络流——SAP模板
2016-03-20 14:38
483 查看
//网络流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 ; int lv ,gap ; 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; } };
相关文章推荐
- Spark性能优化第二季-Task、数据倾斜及网络性能优化
- 网络开发库从libuv说到epoll
- 简单的基于Socket的TCP编程实例
- 深度学习Deep learning
- 为什么深度神经网络难以训练Why are deep neural networks hard to train?
- 神经网络可以拟合任意函数的视觉证明A visual proof that neural nets can compute any function
- POJ 1698 图论之网络流
- J2EE架构之路,好地址:http://www.fengfly.com/plus/view-210104-1.html
- http协议-缓存控制:no-cache/must-revalidate/no-store
- 《MFC网络通信》Part 2 简单TCP通信
- 神经网络可以拟合任意函数的视觉证明A visual proof that neural nets can compute any function
- 4000 基于DES加密的TCP聊天程序
- 计算机网络中一些名词解释(一)
- HttpClient 和 HttpURLConnection 的使用
- H5学习系列之文件读取API--本文转自http://blog.csdn.net/jackfrued/article/details/8967667
- linux 网络源码布局
- C++ 用libcurl库进行http通讯网络编程
- 基础的http协议构成
- TCP三次握手和四次挥手
- HTTP状态码整理