网络流 ek
hdu3549 求最大流果题
ek算法 先bfs出一条流 然后通过不断地添加增广路 得到最大流(证明在算法书上都有)
增加了一个流 就加反向边 允许程序通过走方向边的方式进行“回滚”
i^1 = i+1(i为奇数), i^1 = i-1(i为偶数)这样偶数位置放正边 奇数位置放反边 就可以快速找到边的逆边
pre记录路径 具体是pre存到达当前点的边的序号
pre还顺便可以记录点的访问情况 省去了一个vis数组
每次bfs找到增广路径之后 从终点找到起点 找出最小的边权 就是这次增广增加的流
这个思路是ff方法 用bfs找增广路就是ek算法
O(VE^2) 多半歇逼
就这些
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int maxn = , maxm = , inf = 0x3f3f3f3f;
struct edge{
int u, v, w, nxt;
edge(){}
edge(int u, int v, int w, int nxt):u(u), v(v), w(w), nxt(nxt){}
}e[*maxm];
int cur, head[maxn], pre[maxn];
void addedge(int u, int v, int w){
e[cur] = edge(u, v, w, head[u]);
head[u] = cur++;
e[cur] = edge(v, u, , head[v]);
head[v] = cur++;
}
void init(){
cur = ;
memset(head, -, sizeof(head));
}
bool bfs(int st, int ed){
queue<int>Q;
memset(pre, -, sizeof(pre));
Q.push(st);
while(!Q.empty()){
int u = Q.front();
Q.pop();
if(u == ed)
return true;
for(int i = head[u]; ~i; i = e[i].nxt){
int v = e[i].v, w = e[i].w;
if(w && pre[v] == -){
pre[v] = i;
Q.push(v);
}
}
}
return false;
}
int ek(int st, int ed){
int ans = ;
while(bfs(st, ed)){
int tmp = ed, det = inf;
while(tmp != st){
int edges = pre[tmp];
det = min(det, e[edges].w);
tmp = e[edges].u;
}
tmp = ed;
while(tmp != st){
int edges = pre[tmp];
e[edges].w -= det;
e[edges^].w += det;
tmp = e[edges].u;
}
ans += det;
}
return ans;
}
int main(){
int t, kase = ;
scanf("%d", &t);
while(t--){
init();
int n, m;
scanf("%d%d", &n, &m);
while(m--){
int x, y, w;
scanf("%d%d%d", &x, &y, &w);
addedge(x, y, w);
}
printf("Case %d: ", ++kase);
printf("%d\n", ek(, n));
}
return ;
}
网络流 ek的更多相关文章
- 网络流EK
#include <iostream> #include <queue> #include <string.h> #define MAX 302 using nam ...
- POJ 1459 网络流 EK算法
题意: 2 1 1 2 (0,1)20 (1,0)10 (0)15 (1)20 2 1 1 2 表示 共有2个节点,生产能量的点1个,消耗能量的点1个, 传递能量的通道2条:(0,1)20 (1,0) ...
- 初涉网络流[EK&dinic]
主要还是板子 Edmonds-Karp 从S开始bfs,直到找到一条到达T的路径后将该路径增广,并重复这一过程. 在处理过程中,为了应对“找到的一条路径把其他路径堵塞”的情况,采用了建反向弧的方式来实 ...
- 最大网络流 EK 算法
网络流是什么类型的问题,看一道题目你就知道了 点击打开链接 . 默认具备图论的基本知识,网络流概念比较多,先看看书熟悉一下那些概念.比较好!一个寄出的网络最大流.EK算法写的. 这是一幅网络,求S ...
- POJ1149_PIGS(网络流/EK)
PIGS Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 15721 Accepted: 7021 Description ...
- 网络流EK算法模板
\(EK\)算法的思想就是每一次找一条增广路进行增广. 注意几个点: 存图时\(head\)数组要设为\(-1\). 存图的代码是这样的: inline void add(int u, int v, ...
- HDU1532 Drainage Ditches 网络流EK算法
Drainage Ditches Problem Description Every time it rains on Farmer John's fields, a pond forms over ...
- 2016计蒜之道复赛 菜鸟物流的运输网络 网络流EK
题源:https://nanti.jisuanke.com/t/11215 分析:这题是一个比较经典的网络流模型.把中间节点当做源,两端节点当做汇,对节点进行拆点,做一个流量为 22 的流即可. 吐槽 ...
- POJ-3436 ACM Computer Factory(网络流EK)
As you know, all the computers used for ACM contests must be identical, so the participants compete ...
随机推荐
- updateXML 注入 python 脚本
用SLQMAP来跑updateXML注入发现拦截关键字,然后内联注入能绕,最后修改halfversionedmorekeywords.py脚本,结果SQLMAP还是跑不出来.>_< hal ...
- SQLserver 数据库高版本无法还原到低版本的数据解决方法
sql server 数据库的版本只支持从上往下兼容.即高版本可以兼容低版本 .低版本不能兼容低版本.通常我们在开发时会用比较高的版本.但是部署到客户那边可能他们的数据库版本会比较低. 我们可以通过导 ...
- lsof/netstat命令的一个重要作用: 根据进程查端口, 根据端口查进程
我们知道, 根据ps -aux | grep xxx就是很快实现进程名和进程号的互查, 所以我们只说进程号pid就行. 如下示例中, 进程pid常驻. 1. 根据进程pid查端口: lsof -i ...
- 🍓 移动端调试工具之vconsole的使用~ 🍓
这里以在vue项目中的使用为例⬇️ 嗯模块化的. 不消多说,先cnpm install vconsole -S 然后在mian.js中配置之- ok啦-- 开发混合app的筒子,使用mac的话也有别的 ...
- 在c:forEach与s:iterator里面使用if标签判断当前位置是否为2的倍数
在c:forEach与s:iterator里面使用if标签判断当前位置是否为2的倍数 c:forEach: <c:forEach var="workflow" items=& ...
- vivado中使用MMCM ip核
1.在project中选择IP Catalog 在IP Catalog中选择FPGA Features and Design----->Clocking------>Clocking Wi ...
- python的一些基本概念
1.为什么python被称为胶水语言?他是新一代的系统脚本参考博客:https://www.cnblogs.com/ningskyer/articles/5264172.html 2.python百度 ...
- PHP生成HTML文件, SummerHtml
2018-6-27 20:13:04 星期三 作用: 用PHP生成HTML文档, 支持标签嵌套缩进 起因: 这个东西确实也是心血来潮写的, 我很满意里边的实现缩进的机制, 大家有用到的可以看看 现在都 ...
- JDBC连接MariaDB:数据传输加密
环境:win7+springboot+mybatis+mariadb 需求说明: 未做安全加固前用wireshark抓包: 可以很明显看到用户名.数据库和 SQL,这种情况是有安全风险的. 1.下载o ...
- JavaScript读取对象属性遇到的问题
JavaScript中对于对象的属性存取方式有两种:“.”操作和[]操作. “.”操作属性名通常直接写,[]操作中属性的名字通常要加引号, 而当需要读取的对象属性名是一个变量的时候,一般使用[]操作, ...