//网络流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[N];
int lv[N],gap[N]; void init(int ss,int tt,int num)
{
s=ss;
t=tt;
nn = num;//
cnt=;
memset(pre,-,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=;
edge[cnt].next=pre[v];
pre[v]=cnt++;
} int sdfs(int k,int w)
{
if(k==t) return w;
int f=;
int mi=nn-;
for(int p=pre[k];p!=-;p=edge[p].next)
{
int v=edge[p].to,tw=edge[p].w;
if(tw!=)
{
if(lv[k]==lv[v]+)
{
int tmp=sdfs(v,min(tw,w-f));
f+=tmp;
edge[p].w-=tmp;
edge[p^].w+=tmp;
if(f==w||lv[s]==nn) break;
}
if(lv[v]<mi) mi=lv[v];
}
}
if(f==)
{
gap[lv[k]]--;
if( gap[ lv[k] ]== )
{
lv[s]=nn;
}
lv[k]=mi+;
gap[lv[k]]++;
}
return f;
} int getflow()
{
int sum=;
memset(lv,,sizeof(lv));
memset(gap,,sizeof(gap));
gap[]=nn;
while(lv[s]<nn)
{
sum+=sdfs(s,INF);
}
return sum;
} };

最新文章

  1. 3.EasyUI学习总结(三)——easyloader源码分析
  2. [Maven]Maven详解
  3. The connection to adb is down, and a severe error has occured.(DDMS中没有真机)
  4. Win10走红背后,最开心的人却是谷歌
  5. hibernate hql 大全
  6. nutch 1.7 导入 eclipse
  7. A星寻路lua实现
  8. 调用短信接口,先var_dump()看数据类型是object需要json_decode(json_encode( $resp),true)转换成array
  9. Day 20 常用模块(三)
  10. MySQL一千行笔记
  11. js自己总结的小东西(打印出来方便学习)
  12. 自己写一个 Hash 表
  13. php7 安装mssql 扩展
  14. Ubuntu Eclipse C++运行问题:launch failed.Binary not found
  15. Qt读写ini文件
  16. TF-IDF的解释
  17. [Objective-C] id类型和instancetype类型
  18. Lintcode: Sort Colors II 解题报告
  19. Siddhi初探
  20. Mac 平台安装 Android Studio 集成 Android SDK

热门文章

  1. Notepad++输入模式之改动模式、插入模式
  2. CentOS最常用命令
  3. 一个256行代码的第一人称引擎(Direct2D移植版)
  4. Swift 泛型參数
  5. 远程调用——hessian使用入门
  6. Linux命令常用命令
  7. atitit.解决struts2&#160;SpringObjectFactory.getClassInstance&#160;NullPointerException&#160;&#160;v2&#160;q31
  8. NodeJS CSV导出文件名和内容乱码解决
  9. ffffff
  10. pthread_cleanup_push和pthread_cleanup_pop清除函数是否执行的说明