poj1273(最大网络流问题模版)
网络流才学习,还是不怎么懂,一开始都是看网上写的算法模版,下面的两种方法也是用了网上的模版的:
方法一:
#include <iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn=1e4+1,maxm=2e5+1;
int n,m,s,t,tot=1,head[maxn],vis[maxn];
struct edge{int to,next,w;
}e[maxm];
void add(int x,int y,int w){//采用链式前向星e[++tot].to=y;e[tot].w=w;e[tot].next=head[x];head[x]=tot;
}
int dfs(int x,int flow){if(x==t)return flow;vis[x]=1;for(int i=head[x];i;i=e[i].next){int y=e[i].to,w=e[i].w;if(w&&!vis[y]){int t=dfs(y,min(flow,w));if(t>0){e[i].w-=t;e[i^1].w+=t;return t;}}}return 0;
}
int main(){while(scanf("%d %d",&n,&m)!=EOF){memset(vis,0,sizeof(vis));memset(head,0,sizeof(head));for(int i=1;i<=n;i++){int x,y,w;scanf("%d %d %d",&x,&y,&w);add(x,y,w);add(y,x,0);}t=m;s=1;int res=0,ans=0;while(memset(vis,0,sizeof(vis))&&(res=dfs(s,1e9))>0){ans+=res;}printf("%d\n",ans);}return 0;
}
方法二:#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
const int maxn = 10050;
const int inf = 0x3f3f3f3f;
using namespace std;
typedef long long ll;
struct note{int u, v, w;int next;
}e[maxn*20];
int head[maxn], cnt;
int le[maxn];
int n, m, s, t;
void add(int u, int v, int w){e[cnt].u = u, e[cnt].v = v, e[cnt].w = w;e[cnt].next = head[u], head[u] = cnt++;e[cnt].u = v, e[cnt].v = u, e[cnt].w = 0;e[cnt].next = head[v], head[v] = cnt++;
}
bool bfs(){queue <int> q;memset(le, -1, sizeof(le));le[s] = 0;q.push(s);while(!q.empty()){int u = q.front();q.pop();for(int i=head[u]; i!=-1; i=e[i].next){int v = e[i].v;if(e[i].w > 0 && le[v]==-1){le[v] = le[u]+1;q.push(v);}}}return le[t] != -1;
}int dfs(int u, int inf){if(u == t)return inf;int flow = 0;for(int i=head[u]; i!=-1; i=e[i].next){int v = e[i].v;if(e[i].w > 0 && le[u] + 1 == le[v]){int tmp = dfs(v, min(inf-flow, e[i].w));e[i].w -= tmp;e[i^1].w += tmp;flow += tmp;}}if(!flow)le[u] = inf;return flow;
}
void Dinic(){int maxflow = 0, tmp;while(bfs()){while((tmp = dfs(s, inf))){maxflow += tmp;} }printf("%d\n", maxflow);
}
int main(){while(scanf("%d %d", &m, &n)!=EOF){memset(head,0,sizeof(head));memset(le,0,sizeof(le));for(int i=0; i<=n; i++)head[i] = -1;for(int i=0; i<m; i++){int a, b, w;scanf("%d%d%d", &a, &b, &w);add(a, b, w);}t=n;s=1;Dinic();}return 0;
}
poj1273(最大网络流问题模版)相关推荐
- poj1273(网络流模板)
题目链接:http://poj.org/problem?id=1273 思路:网络流裸题 #include <cstdio> #include <cstdlib> #inclu ...
- poj 3469(网络流模版)
题目链接:http://poj.org/problem?id=3469 思路:终于把网络流的模版测试好了,在Dinic和Sap之间还是选择了Sap,事实证明Sap确实比Dinic效率高,在此贴出自己的 ...
- POJ1273 裸裸的网络流
北京好热啊,宿舍还没空调,都不能安安静静地敲代码了~>_<~今天老师讲网络流完全没听啊,晚上想了好久的网络流,感觉还是没有完全理解,过了一道模板题. Drainage Ditches Ti ...
- [模版] 网络流最大流、费用流
反向边作用讨论:http://blog.csdn.net/qq_21110267/article/details/43540483 我理解的很有限,希望有研究过的人能给我评论指导. 代码: By:Ru ...
- 网络流Dinic算法模板 POJ1273
这就是以后我的板子啦~~~ #include <queue> #include <cstdio> #include <cstring> #include <a ...
- 【网络流】学习笔记:一次理解网络流!
一.从概念入手 网络流用于解决流量问题 网络流:所有弧上流量的集合f={f(u,v)},称为该容量网络的一个网络流. 定义:带权的有向图G=(V,E),满足以下条件,则称为网络流图(flow netw ...
- 关于网络流sap算法
今天终于学习了网络流..之前一直很怕这类问题,个人觉得网络流算是图论里面最难的了.... sap学习下来感觉一般,关于解法都是意识流,细节也是蛮多的.. 我这里先贴一份模版,自已也加了点注释(只是个人 ...
- POJ1273 Drainage Ditches(最大流基础题)
在讨论问题之前先说一句,如果你这题WA了很久,请先看以下一句话,或许可以省下你翻遍全文的时间: 注意考虑重边.(是不是想大呼[Bi-]?传送门:http://poj.org/problem?id=12 ...
- (通俗易懂小白入门)网络流最大流——EK算法
网络流 网络流是模仿水流解决生活中类似问题的一种方法策略,来看这么一个问题,有一个自来水厂S,它要向目标T提供水量,从S出发有不确定数量和方向的水管,它可能直接到达T或者经过更多的节点的中转,目前确定 ...
最新文章
- Linux内置的审计跟踪工具:last命令
- SQL、Linq和Lambda表达式 的关系
- JavaScript碎片—函数闭包(模拟面向对象)
- 考虑页面置换算法,系统有m个物理块供调度,初始时全空,页面引用串长度为p,包含了n个不同的页号,无论用什么算法,缺页次数不会少于( )
- Java线程同步的一些例子
- abaqus单位_ANSYS和ABAQUS哪个好,一个例子告诉你
- C/C++知识分享番外:如何申请一个腾讯地图用户Key?
- SD2.0-课程等待时候的摘抄
- ob_start()函数
- Nero 7序列号的验证方法
- 数字图像处理课程设计-疲劳检测系统
- 深度学习名词(中英文对照)
- SRS 流媒体服务器对http-flv流进行配置
- 使用地图编辑器构建游戏场景
- Linux动态频率调节系统CPUFreq之三:governor
- 智能、精准、节能丨极海APM32F103RCT7 LED车灯应用方案
- (转载)基于LBS地图的开发,满足地图上有头像的需求
- Python中的args和kwargs
- 苹果手机10秒解除锁屏_Redmi 10X手机密码忘了怎么办?手机10秒解除锁屏,三步解开安卓苹果密码【详细步骤】...
- 频繁跳槽的人简历是不是更容易被淘汰?