/**
贴下最小费的邻接表模板
图算法中邻接表应用极其广泛,在速度和边处理方面都要比矩阵好很多
最小费邻接矩阵模板前面提到了 就不多说了
包括添边等常用的技巧前面也都提到了
就是求网络流是会用到逆流边
用邻接表添边,逆流边也相当经典,这个技巧刚开始并不好理解
比如:设edge[p] = ab; 则逆流边为 edge[p^1] = ba;
p^1 这是个什么东西?? ^ 这个符号是异或,p^1 = ???
如果p 为偶数则 p^1 = p+1, 如果p 为奇数 p^1 = p-1;
所以p^1 总能得到一个与自己相邻的数
把这个现象用到解决逆流边上面,因为添边时候的下一条边就为逆流边
所以如果从一个偶数开始
比如:从2开始 edge[2] = ab; edge[3] = ba; edge[4] = bc; edge[5] = cb;
每次都会添两条边,所以下一条边开始必为偶数 p ,而它的逆流边即为 p^1
具体看代码
*/
struct {
int v, cap, cost, next;
}edge[eM]; //边结构体 eM为 最多有多少条边
int ne, edgeHead[nM]; //nM为 点的个数
int pre[nM]; //用来记录增广路径
int ans, ne;
void addEdge(int u, int v, int c, int w) {
edge[ne].v = v;
edge[ne].cap = c;
edge[ne].cost = w;
edge[ne].next = edgeHead[u];
edgeHead[u] = ne++;
edge[ne].v = u;
edge[ne].cap = 0;
edge[ne].cost = -w;
edge[ne].next = edgeHead[v];
edgeHead[v] = ne++;
}
bool spfa(int s, int t) {
//spfa算法前面也介绍过,这里用的栈模式,还有一个队列版,简单修改下就能得到
//一定要记住有时栈会超时,有时队列也会超时,总有一个能过
int dis[nM], stack[nM], vis[nM];
int i, top = 0;
for (i=0; i<=n; i++) {
dis[i] = inf;
vis[i] = false;
}
dis[s] = 0;
stack[++top] = s;
vis[s] = true;
while (top) {
int u = stack[top--];
for (i=edgeHead[u]; i!=0; i=edge[i].next) {
int v = edge[i].v;
if (edge[i].cap && dis[v] > dis[u] + edge[i].cost) {
dis[v] = dis[u] + edge[i].cost;
pre[v] = i; //记录路径用的是边号,所以 u = edge[p^1].v;
if (!vis[v]) {
vis[v] = true;
stack[++top] = v;
}
}
}
vis[u] = false;
}
if (dis[t] < inf) return true;
return false;
}
void end(int s, int t) {
//这些原理和邻接矩阵一模一样
int u, p, sum = inf;
for (u=t; u!=s; u=edge[p^1].v) {
p = pre[u];
sum = min(sum, edge[p].cap);
}
for (u=t; u!=s; u=edge[p^1].v) {
//嗯,这个好好模拟下,技巧噢
p = pre[u];
edge[p].cap -= sum;
edge[p^1].cap += sum;
ans += edge[p].cost * sum;
}
}
int main() {
//初始化
memset(edgeHead, 0, sizeof (edgeHead));
ne = 2; //一定要从偶数开始,因为edgeHead 初始化为0 了所以赋值为2
ans = 0; //最小费
/**
***建图添边****
调用addEdge()添边,uv 表示一条边,c为流量,w为花费
则 addEdge(u, v, c, w); 即可
这才是重重之中的技能
关键在建图,模板都会套
*/
//调用
while (spfa(s, t))
end(s, t);
//s为源点,t为汇点
return 0;
}
收藏于 2012-01-12相关推荐
MONAILabel in 3D Slicer 案例1: 在腹部CT中自动分割脾脏
MONAILabel in 3D Slicer 案例1: 在腹部CT中自动分割脾脏。
最小费用最大流——EK+SPFA
终于把最小费用最大流学会了啊…… 各种奇奇怪怪的解释我已经看多了,但在某些大佬的指点下,我终于会了。 原来是个好水的东西。 最小费用最大流是什么? 不可能不知道网络流吧?如果不知道,自行百度去…… 费用流就是在每条边添加个费用,设你这条边的流量是fff,费用为www,则总费用为fwfwfw。 举个例子,就像是有许多点的一张图,有很多个管子相连,每个管子都有个容量,并且每流一流量就要花一...
huggingface 镜像站推荐
在做 Ai 应用开发或者学习的时候,我们经常需要下载各种模型,而 huggingface 的模型下载速度很慢或者根本就连不上,这里推荐一个 huggingface 的镜像站,速度很快,可以大大提高我们的效率。
网络流----最小费用最大流(EK+SPFA)
该网络中总花费最小的最大流称为最小费用最大流,总花费最大的最大流称为最大费用最大流,二者合称费用流模型,即在最大流的前提下考虑费用的最值。
[漏洞利用]利用五次Shift越权破解win7\win10开机密码
注:第一个学习和接触的Windows漏洞 文章目录本机实验环境前置知识漏洞原理漏洞介绍漏洞验证解决方法基本流程介绍详细步骤截图 本机实验环境 虚拟机:VMware Workstation 14 pro 操作系统:Windows10 前置知识 1、cmd工具路径 c:\windows\system32\cmd,按五次shift默认调用同目录下sethc文件,其路径为“c:\windows\system32\sethc.exe” 2、用户/账户密码存储位置 c:\windows\system32\config\
YOLOv12 改进 | Backbone改进 3
将CSP中的简单拼接改为可学习的特征选择门控,动态决定哪些特征流向下一层,同样再写这篇。:相比静态CSP的固定50/50分割,门控机制可学习0.3:0.7等最优比例。在输入端加入轻量SR模块,对下采样后的特征进行超分恢复,提升小目标检测能力。(小目标): 从 0.51 AP → 0.63 AP (+24%):采用ESPCN的高效亚像素卷积,避免传统插值的信息损失。:从通道级(SE)到空间级(Spatial)的多粒度控制。:结合浅层细节和深层语义,恢复小目标的纹理信息。
网络流之最小费用最大流(EK + SPFA 模板)
【代码】网络流之最小费用最大流(EK + SPFA 模板)
深度解析 Android 开发工程师岗位:技术栈、职责与面试全攻略
本文深度剖析Android开发工程师职位要求,从核心技术栈到面试准备进行全面解读。关键点包括:1)掌握Kotlin语言特性和Jetpack组件;2)具备UI开发、性能优化和逆向分析能力;3)理解MVVM架构和Room数据库;4)熟悉常用工具链和开发流程。文章提供了详细的面试题库及解析,涵盖基础概念、UI优化、架构设计等方向,并给出职业发展建议:夯实基础、拓展技术广度、培养工程素养。旨在帮助开发者系统性地准备Android岗位求职,把握移动开发领域的技术趋势。
图论:费用流-SPFA+EK
利用SPFA+EK算法解决费用流问题 例题不够裸,但是还是很有说服力的,这里以Codevs1227的方格取数2为例子来介绍费用流问题 这个题难点在建图上,我感觉以后还要把网络流建模想明白才能下手去做这种题,老实说挺难的 先直接给出建图的代码: scanf("%d",&x); //把每个节点拆成两个,分别为ai和bi //a...
无人机正射影像DOM孔洞修补的另一种方法并调整影像色差(附GlobalMapper24安装包(中文注册版))
之前介绍了用GlobalMapper联合PhotoShop对无人机正射影像DOM进行破洞修补,但是ps修图非常耗时,需要耐心和足够的细心。对于大面积的水域空洞,纹理特征都差不多,没必要修补得那么细致入微,本文介绍另一种直接在Global Mapper中快速修补大面积水域空洞的方法。 一、Global Mapper中检查数据 二、使用“数字化”工具,绘制需要补洞的多边形区域 三、导出绘制好的矢量区域 四、打开影像下载软件,选择影像图源 五、下载影像 六、调整影像的色差 七、合并影像并输出 八、检查结果数据
Qt入门教程【数据类型篇】数值类型
Qt中的数值类型
最小费用最大流 spfa() + ek()
/** 一个多月没碰,感觉忘完了…… 最小费就是有多条路可以满足最大流量的情况下所需要的最小费用 把费用改成相反数或改下spfa()的松弛就可最大费了 比如:从北京到上海运送一批货物,给出中间经过每条路线上对每辆车的收费,以及 每条路一次允许经过的车的数量,求一次性从北京到上海送尽可能多的货物情况下的最 小费用,当然中间经过的路线用二维数组即可表
Data-Structures-and-Algorithm-Analysis-in-Java.pdf
作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...
poj 2195 最小费用最大流 EK+SPFA
传送门 题意:给你一个矩阵,里面有数量相等的H和m,代表房子和人,每个人要找个房子,一个人到一个房子的费用是他走的步数,一个房子只能容纳一个人,求所有人都到房子的最小费用。 个人心得:第一次做最小费用最大流,原本不会费用流的,借着这题就是想学习一下,网上各种博客讲的都好神啊。由于本人最大流只会EK算法(最慢的),所以对于网上大牛的博客各种看不懂,直到看到了这个,里面说就是把EK算法的BFS过程
蓝牙模块HM-10手册
蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。
SAP B1中文培訓教材_SDK
公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说
poj 2135 最小费用最大流 EK+SPFA
传送门 题意:n个点m条边,从1出发到n,再从n返回1,不走重复的边,求路程最少是多少。 个人心得:无向图的网络流,一开始对于建双边还心存不解,后来想着想着就想明白了,明白了就好。 思路:能从1到n,又从n到1,且不经过重复发边,其实就是1有两条不同的路到n。按照题意给的边建立双向边,虽说是双向,不过写出来差不多就是1条变4条了,这里要注意反向对称的边的容量(一开始赋值错了,死循环了。。。)
STM32F407中文手册
STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。
【网络流】——最小费用最大流EK算法
本文非原创,大部分参考自秋日私语大大的题解。 GO:模板 最大流问题,我们可以通过EK,DINIC等方法解决,但是如果在每条边上加上边权,并定义 费用 为边权乘以流量,在所有最大流中求出费用最少的那一个方案,就需要新的算法了。 这里只对最小费用最大流的EK-SPFA算法做一些自己的解释,并会附上模板。 首先是EK算法: 1.我们每次求一条源点到汇点的路径,流量最...
费用流模板 ek+spfa和 dinic+spfa
ek+spfa #include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<queue> #include<string> #define ll long long using namespace std; const i...
洛谷p3381 最小费用最大流模板题 spfa+ek
题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用。 输入格式 第一行包含四个正整数N、M、S、T,分别表示点的个数、有向边的个数、源点序号、汇点序号。 接下来M行每行包含四个正整数ui、vi、wi、fi,表示第i条有向边从ui出发,到达vi,边权为wi(即该边最大流量为wi),单位流量的费用为fi。 输出格式...
图论——网络流——最小费用流(1.0版)
一、spfa+EK算法: 算法思路: 1、通过spfa找增广路 { 将费用看成 距离,通过在最小距离的前提下找增广路。 } 2、通过EK计算增加量 #include <iostream> #include<bits/stdc++.h> using namespace std; #define INF 0x3f3f3f3f const int maxn = 5000 + 7...
邻接表--建图、spfa、EK算法 (转化为最小费用最大流)
#include #include #include #include #include #include #include #include #define inf 1<<30 //poj2135(邻接表--建图、spfa、EK算法) #define N 1010 using namespace std; /* 总结: 邻接表相对于邻接矩阵要
网络流——最小费用最大流MCMF【EK+SFPA Dinic+SPFA 模板】
什么是最小费用最大流 一个网络,每个边除了流量,还有一个单位费用,这条边的费用相当于它的单位费用乘上它的流量,我们要保持最大流的同时,还要保持边权最小,这就是最小费用最大流问题。 在一个网络流图中,最大流量只有一个,但是获得最大流的方案可能有很多种,每种不同的方案所经过的边不同因此费用也就不同,所以需要用到最短路算法。 总增广的费用=最短路费用*总流量 求MCMF中的SFPA算法就是把EK中的bfs改成spfa,这样在求最大流的过程中最小费用流也求出来了。 P3381 【模板】最小费用最大流 #incl
网络流--最小费用最大流 (理解)
1、什么是最小费用最大流问题 上篇文章我们讲解了最大流问题,那什么是最小费用最大流呢?听名字就可以看出,我们要在满足最大流的同时找到达成最大流的最小费用。 对于一个网络流,最大流是一定的,但是组成最大流的费用是可以不同的,这里就有了在最大流网络上产生的费用流网络,就有了最小花费问题。 简单来说,就是满足最大流的路径可能有多条,我们要从这多条路径中找到一条花费代价最小的路径。...
算法学习笔记:网络流#5——EK 求解费用流
算法学习笔记:网络流#5——EK 求解费用流1. 前言2. 详解3. 总结 1. 前言 费用流,全程最小费用最大流,是网络流的一个分支。 最小费用最大流的问题描述如下: 给出一张网络 G=<V,E>G=<V,E>G=<V,E>,每条边有两个权值:f,vf,vf,v。 fff 表示这条边的最大流量,vvv 表示单位花费,也就是说从这条边每流过一单位流量就要增加 vvv 的花费。 现在要求这张网络的最小费用最大流,也就是在保证总流量最大的情况下总费用最小。 在往下看之前,您需
最小费用最大流
解释:每次在s-t之间找出费用最小的一条路径即单源最短路,如果t点不再被访问到,则算法终止。否则,按着最短路径找出最小剩余容量c,最大流量加上c,再更新最短路径上的边,前向弧减去c,反向弧加上c,并且造一条逆向的费用边,最小费用加上每条边的花销,每条边的花销=单位费用*c。 最小费用最大流既能求最小费用,又能得出最大流,是更为一般的模型。 模板: #define maxn 200
spfa费用流java_EK-SPFA费用流 总结+模板——【【模板】最小费用最大流】
【用途】每一条边增加一个参数:每个单位流量的费用;求解在最大流的情况下最小的费用。【主要思路】EK算法,即SPFA+增广路在图上以费用为边权跑SPFA:在更新的过程中,如果更新成功,那么顺便进行往下一个结点尽可能多地流水,并且把流水的路径记录下来(pre[v]=u->v的边)。跑完SPFA后,顺着之前记录的路径从汇点溯回到源点,并且进行增广路。最小的总费用就是累计 (当前路径所流总量) ...
MCMF (EK + SPFA)
// // Created by Visors on 2020/9/30. // // 题目名:【模板】最小费用最大流 // 题目来源:luogu // 题目链接:https://www.luogu.com.cn/problem/P3381 // 算法:MCMF.cpp // 用途:最小费用最大流 // 时间复杂度:O(TODO) // #include <bits/stdc++.h> using namespace std; const int oo = 0x3f3f3f3f; typ
1939



被折叠的 条评论
为什么被折叠?



