poj3469 DINIC模板(vector+前向星)
来源:互联网 发布:网购商城农村淘宝 编辑:程序博客网 时间:2024/06/04 18:19
昨天写最大获利 的时候惊奇的发现我的dinic模板竟然挂了。。。
现在刚刚调对。。。。
这个模板。。。一个很大的优点就是他很好理解,基本上是抄的lrj的白书,但是同时一个很明显的缺点就是vector太慢了!!!!
有时间我会改进成前向星版本的。。。
如果这个模板啥时候TLE了大家不要激动。。。只需要把vecotor改成前向星就可以了
比如说我的poj3680.。。。。。。
模板基本没有什么难理解的地方
注意每次增广都都只在残留网络中进行
还有一些小的优化
比如cur数组的应用
这些都挺好理解的
#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include<vector>#include<queue>#define MAX 600100#define inf 0x7fffffffusing namespace std;int n,m;struct dinic{struct Edge{int from,to,cap,filp;};vector<int>g[MAX];vector<Edge>edge;void add_edge(int From,int To,int Cap,int Cap_){edge.push_back((Edge){From,To,Cap,0});edge.push_back((Edge){To,From,Cap_,0});int mm=edge.size();g[From].push_back(mm-2);g[To].push_back(mm-1);}int s,t;int cur[MAX];int dis[MAX];int done[MAX];bool bfs(){memset(done,0,sizeof(done));queue<int> q;q.push(s);done[s]=1;dis[s]=0;while(!q.empty()){int now=q.front();q.pop();for(int w=0;w<g[now].size();w++){Edge &e=edge[g[now][w]];if(done[e.to]==0&&e.cap>e.filp){done[e.to]=1;dis[e.to]=dis[now]+1;q.push(e.to);}}}return done[t];}int dfs(int x,int a){if(x==t||a==0)return a;int flow=0,f;for(int &w=cur[x];w<g[x].size();w++){Edge &e=edge[g[x][w]];if(dis[e.to]==dis[x]+1&&(f=dfs(e.to,min(a,e.cap-e.filp)))>0){e.filp+=f;edge[g[x][w]^1].filp-=f;flow+=f;a-=f;if(!a)break;}}return flow;}int maxfile(int S,int T){this->s=S;this->t=T;int answer=0;while(bfs()){memset(cur,0,sizeof(cur));answer+=dfs(s,inf);}return answer;}}solve;int main(){scanf("%d%d",&n,&m);int s,t;s=0;t=n*2+1;for(int i=1;i<=n;i++){int a1,a2;scanf("%d%d",&a1,&a2);solve.add_edge(s,i,a1,0);solve.add_edge(i,t,a2,0);}for(int i=1;i<=m;i++){int a1,a2,a3;scanf("%d%d%d",&a1,&a2,&a3);solve.add_edge(a1,a2,a3,a3);}int answer=solve.maxfile(s,t);printf("%d\n",answer);return 0;}
好吧由于写一个水题的时候vector又被卡了所以很不爽
然后就终于决定来改下原来的模板了。。。
对于这个题
vector跑了4891ms
前向星跑了4829ms
但是如果数据再大些的话前向星的优势会更大。。
所以都贴上来吧
#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include<vector>#include<queue>#define MAX 600100#define inf 0x7fffffffusing namespace std;int n,m;struct dinic{struct Edge{int from,to,cap,filp;};vector<int>g[MAX];vector<Edge>edge;void add_edge(int From,int To,int Cap,int Cap_){edge.push_back((Edge){From,To,Cap,0});edge.push_back((Edge){To,From,Cap_,0});int mm=edge.size();g[From].push_back(mm-2);g[To].push_back(mm-1);}int s,t;int cur[MAX];int dis[MAX];int done[MAX];bool bfs(){memset(done,0,sizeof(done));queue<int> q;q.push(s);done[s]=1;dis[s]=0;while(!q.empty()){int now=q.front();q.pop();for(int w=0;w<g[now].size();w++){Edge &e=edge[g[now][w]];if(done[e.to]==0&&e.cap>e.filp){done[e.to]=1;dis[e.to]=dis[now]+1;q.push(e.to);}}}return done[t];}int dfs(int x,int a){if(x==t||a==0)return a;int flow=0,f;for(int &w=cur[x];w<g[x].size();w++){Edge &e=edge[g[x][w]];if(dis[e.to]==dis[x]+1&&(f=dfs(e.to,min(a,e.cap-e.filp)))>0){e.filp+=f;edge[g[x][w]^1].filp-=f;flow+=f;a-=f;if(!a)break;}}return flow;}int maxfile(int S,int T){this->s=S;this->t=T;int answer=0;while(bfs()){memset(cur,0,sizeof(cur));answer+=dfs(s,inf);}return answer;}}solve;int main(){scanf("%d%d",&n,&m);int s,t;s=0;t=n*2+1;for(int i=1;i<=n;i++){int a1,a2;scanf("%d%d",&a1,&a2);solve.add_edge(s,i,a1,0);solve.add_edge(i,t,a2,0);}for(int i=1;i<=m;i++){int a1,a2,a3;scanf("%d%d%d",&a1,&a2,&a3);solve.add_edge(a1,a2,a3,a3);}int answer=solve.maxfile(s,t);printf("%d\n",answer);return 0;}
0 0
- poj3469 DINIC模板(vector+前向星)
- 最大流dinic算法模板(链式前向星)
- poj3469 Dinic
- hdu3572 Task Schedule--Dinic算法 & 最大流 & 链式前向星 & vector
- HDU1532_Drainage Ditches(网络流/EK模板/Dinic模板(邻接矩阵/前向星))
- dinic网络流前向星写法
- 杭电3549 Flow Problem(最大流Dinic+前向星模板)
- 链式前向星 模板
- 链式前向星模板
- 链式前向星模板
- POJ 3436 ACM Computer Factory(拆点+前向星dinic)||(拆点+邻接矩阵dinic)||(不拆点+dinic))
- hashtable (vector&链式前向星)
- 前向星,比vector快一点
- [模板]hash链式前向星模板
- (POJ3469)Dual Core CPU 网络流最小割,Dinic模板应用
- 链式前向星的模板
- 【模板】前向星+树链剖分+线段树
- 前向星式prim模板
- LeetCode 之 DFS 深度优先遍历
- Using Jinja Template
- Android高手进阶教程(十七)之---Android中Intent传递对象的两种方法(Serializable,Parcelable)!
- Android进阶2之Activity之间数据交流(onActivityResult的用法)
- California Dream--加州实习面经
- poj3469 DINIC模板(vector+前向星)
- 算法概论思维导图
- Mercurial command in bitbucket
- 13种常用按钮,文本框
- 黑马程序员——IO流的总结与功能分析(一)
- 基于DAD方法的IBM敏捷开发过程中的敏捷管理
- Lmod安装(environment module system )
- Pulse Width Modulation (PWM)
- 分布式机器学习的故事