网络流(Dinic && ISAP)
来源:互联网 发布:淘宝卖特产没证可以吗 编辑:程序博客网 时间:2024/06/04 19:00
放上一下模板的好。毕竟老忘。
Dinic: while(BFS()) ans+=DFS(S, ∞)
#include<iostream>#include<cstdio>#include<cstring>#include<queue>using namespace std;#if 0Writers: Goes && G.S.M.Have falled in love#endifinline int read(){ char ch=getchar();int sum=0; while(ch<'0'||ch>'9') ch=getchar(); while(ch>='0'&&ch<='9') sum*=10,sum+=ch-'0',ch=getchar(); return sum;}const int N=1000010;const int INF=(1<<30);struct ss{ int to,nex,va;}edge[N<<1];int head[N],ecnt=1;int n,m,s,t;void add(int va,int y,int x){ edge[++ecnt]=(ss){y,head[x],va}; edge[++ecnt]=(ss){x,head[y],0}; head[x]=ecnt-1;head[y]=ecnt;}int level[N];bool BFS(){ memset(level,0,sizeof(level)); level[s]=1;queue<int>Q;Q.push(s); while(!Q.empty()){ int pos=Q.front();Q.pop(); for(int i=head[pos];i;i=edge[i].nex) if(edge[i].va&&!level[edge[i].to]){ level[edge[i].to]=level[pos]+1; Q.push(edge[i].to); } }return level[t];}int DFS(int pos,int mflow){ if(!mflow||pos==t)return mflow;int ret=0; for(int i=head[pos];i;i=edge[i].nex) if(edge[i].va&&level[edge[i].to]==level[pos]+1) { int temp=DFS(edge[i].to,min(mflow,edge[i].va)); ret+=temp;mflow-=temp;edge[i].va-=temp; edge[i^1].va-=temp; }return ret;}inline int Dinic(){ int ret=0;while(BFS())ret+=DFS(s,INF); return ret;}int main(){ n=read(),m=read(),s=read(),t=read(); for(int i=1;i<=m;i++) add(read(),read(),read()); printf("%d",Dinic());return 0;}
ISAP:一次BFS定级,后续按最近点级数修改。
优化关键:gap优化,cur数组的优化
思路:能往下流就往下流,不能流了回溯修改。
(60ms……比dinic的300ms 靠谱多了……emmmm…..)
#include<iostream>#include<cstdio>#include<cstring>#include<queue>using namespace std;#if 0Writers: Goes && G.S.M.Have falled in love#endifconst int N=100007;const int INF=(1<<30);inline int read(){ char ch=getchar();int sum=0; while(ch<'0'||ch>'9') ch=getchar(); while(ch>='0'&&ch<='9') sum*=10,sum+=ch-'0',ch=getchar(); return sum;}int n,m,S,T;struct ss{ int to,nex,va;}edge[N<<1];int head[N],ecnt=1;void add(int va,int y,int x){ edge[++ecnt]=(ss){y,head[x],va}; edge[++ecnt]=(ss){x,head[y],0}; head[x]=ecnt-1;head[y]=ecnt;}int dis[N],num[N],cur[N],fa[N];void BFS(){ for(int i=1;i<=n;i++) dis[i]=N; queue<int>Q;Q.push(T);dis[T]=0; while(!Q.empty()){ int pos=Q.front();Q.pop(); for(int i=head[pos];i;i=edge[i].nex) if(edge[i^1].va&&dis[edge[i].to]>dis[pos]+1) { dis[edge[i].to]=dis[pos]+1; Q.push(edge[i].to); } }return ;}int out(){ int pos=T,f=INF; while(pos!=S)pos=fa[pos],f=min(f,edge[cur[pos]].va); pos=T; while(pos!=S)pos=fa[pos], edge[cur[pos]].va-=f, edge[cur[pos]^1].va+=f; return f;}inline int gswork(){ BFS();int pos=S,flow=0; for(int i=1;i<=n;i++) num[dis[i]]++,cur[i]=head[i]; while(dis[S]<n){ if(pos==T)flow+=out(),pos=S; bool done = false; for(int i=cur[pos];i;i=edge[i].nex) if(edge[i].va&&dis[pos]==dis[edge[i].to]+1) { fa[edge[i].to]=pos;cur[pos]=i; pos=edge[i].to;done=true;i=0; } if(!done){ int minx=n; for(int i=head[pos];i;i=edge[i].nex) if(edge[i].va) minx=min(minx,dis[edge[i].to]); if(--num[dis[pos]]==0)break; num[dis[pos]=minx+1]++;cur[pos]=head[pos]; if(pos!=S)pos=fa[pos]; } }return flow;}inline void gsin(){ n=read();m=read();S=read(),T=read(); for(int i=1;i<=m;i++) add(read(),read(),read());}int main(){gsin();printf("%d",gswork());return 0;}
阅读全文
0 0
- 网络流(Dinic && ISAP)
- 网络流模板 Dinic+ISAP
- hdu 3549 网络流模板(dinic + ISAP)
- POJ 1273 网络流(EK,Dinic,ISAP)
- 网络流算法总汇(ek,dinic,isap)
- HDU 4280 网络流(ISAP || Dinic)
- 最大流ISAP+Dinic
- 网络流最大流算法(ISAP算法及DINIC算法)
- 网络流模板:最大流ISAP算法和Dinic算法
- 网络流模板:最大流ISAP算法和Dinic算法
- poj_1459 Power Network(多源多汇最大网络流)(EK / dinic / ISAP)
- POJ 3281 Dining( 网络流, Dinic 和ISAP )
- 最大流模板(Dinic, ISAP)
- 最大流算法,Dinic,ISAP
- POj 1273 Drainage Ditches (最大流 Dinic + ISAP 模板)
- hdu3549 Flow Problem 网络最大流的三种写法(Ek,Dinic(邻接矩阵,邻接表),Isap)
- 网络流之最大流 EK/Dinic/Isap算法 学习笔记
- 网络流(dinic)
- libux创建逻辑卷及扩展
- Jsoup通过URL获取文档,获取href属性内容
- caffe移植到mxnet
- Windows套接字I/O模型(3) -- WSAAsyncSelect模型
- 利用JS实现复选框一键全选/全不选
- 网络流(Dinic && ISAP)
- 谷歌浏览器js调试初体验
- classpath、path、JAVA_HOME的作用及JAVA环境变量配置
- Spring-boot 集成 kakfa 源码分析
- AI人工智慧成长迅速 恐在20年取代程序设计师?
- ent en et的区别
- Spring MVC +Spring + Mybatis 构建分库分表总结 SSM搭建以及分库分表的实现
- .Net对于源代码的处理
- SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)