ACM北大暑期课培训第八天
今天学了有流量下界的网络最大流,最小费用最大流,计算几何。
有流量下界的网络最大流
如果流网络中每条边e对应两个数字B(e)和C(e), 分别表示该边上的流量至少要是B(e),最多 C(e),那么,在这样的流网络上求最大流,就是有下界的最大流问题。
这种网络不一定存在可行流
思路:将下界“分离”出去,使问题转换为下界为0的普通网络流问题。
将原弧(u,v)分离出一条必要弧和一条非必要弧:
假设B(u,v)是下界,则分离出两条弧: C1(u,v) = B(u,v) -- 必要弧
C2(u,v) = C(u,v) – B(u,v)


由于必要弧的有一定要满流的限制,将必要弧“拉” 出来集中考虑

添加附加点x,y。想像一条不限上界的(x, y),用必要弧将它们“串”起来,即对于有向必要弧(u, v),添加 (u, x),(y, v),容量为必要弧容量。这样就建立了一个等价的网络。

去掉边(x,y),添加由t到s的容量为正无穷大的边,使y和 x分别成为新的源和新的汇。

若此图上的最大流能够占满与Y相连的所有边的容量(自 然也就会占满所有连到x的边的容量),那么原图上就存 在满足上下界条件的可行流。若最大流不能够占满与Y相 连的所有边的容量,则原图不存在可行流。

新图最大流若小于新图中x的流入量之和,则原问题 无解
在新图的最大流中,求出s流出的流量之和,记为 sum1
在做过一遍最大流的新图的残余网络中,去掉t->s 以及s->t的边,然后以s为源,t为汇再做一次最大流, 此时得到的流量 sum2,则 sum1+sum2就是在原图 上满足下界的最大流。
和x,y相连的边不用处理,因为x,y实际上是只能流入 或只能流出的点,在图中不起作用。
要想求出每条边上的流量,怎么办?
在做第二次最大流之前,将图备份到G2
经过两次求最大流后,最后变成的残余网络是G
此时G2[i][j] – G[i][j] + LC[i][j] 就是 i->j上的流量
LC[i][j] 是i->j边上的流量下界(下界是被满足的)
处理网络流题目要注意,如果有重边,则要将重边 上的容量和下界累加,合并成一条边。
例题:POj 2396 Budget
题目:
现在有一个n*m的方阵,方阵里面的数字未知,但是我们知道如下约束条件:
> 每一行的数字的和
> 每一列的数字的和
> 某些格子里的数,大小有限制。比如规定第2
行第3列的数字必须大于5(或必须小于3,或必须等于10等) 求解是否存在在满足所有的约束的条件下用正数来填充该方阵的方案,若有,输出填充后的方阵,否则输出IMPOSSIBLE. 这道题可以转化成容量有上下界的最大流问题,将方阵的行从1……n编号,列n+……n+m编号,添加源点s=0和汇点t=n+m+.
>将源点和每一个行节点相连,相连所形成的边的容量和下界置为该行所有数字的和
>将每一个列节点和汇点相连,相连所形成的边的容量和下界都置为该列所有数字的和
>从每个行节点到每个列节点连边,容量为无穷大
> 如果u行v列的数字必须大于w,则边<u,v+n>流量的下界是w+
> 如果u行v列的数字必须小于w,则边<u,v+n>容量改为w-
> 如果u行v列的数字必须等于w,则边<u,v+n>流量的下界和容量都是w找到的可行流(也是最大流),就是问题的解 本题trick:
) W可能为负数,产生流量下界为负数的情况。应处理成0
) 数据本身可能矛盾。比如前面说了 (,) =,后面又说(,) =
题目+思路
最小费用最大流
以下内容引自http://web.nuist.edu.cn/courses/dlxxxt/ch5/5.7.3.htm
http://jpkc.lzjtu.edu.cn/material3/xxxt/zxfyzdl.htm
设有一个网络图G(V,E),,V={s,a,b,c,…,s’},E中 的每条边(i,j)对应一个容量c(i,j)与输送单位流量所需费用 a(i,j)。如有一个运输方案(可行流),流量为f(i,j),则 最小费用最大流问题就是这样一个求极值问题: 其中F为G的最大流的集合,即在最大流中寻找一个费用 最小的最大流。


反复用spfa算法做源到汇的最短路进行增广,边权值为边上单位费用。反向边上的单位费用是负的。
直到无法增广,即为找到最小费用最大流。
成立原因:每次增广时,每增加1个流量,所增加的费用都是最小的。 (最短路) (最小费用==>路径长度总和)
因为有负权边(取消流的时候产生的),所以不能用迪杰斯特拉算法求最短路。(用SPFA)
二分图最大匹配(网络流问题)
计算几何
基础——点、线、面
解析几何:列方程,解方程 (麻烦,特殊情况太多)
计算几何:1.表示简单
2.功能强大
3.特殊情况少,思维难度较低
4.函数可重复利用(即所谓的“模版”)
5.尽可能避免除法和三角函数,精度高,效率高
struct CVector///矢量表示
{
double x, y;
};
///表示从0点到 (x,y)的矢量。对矢量只关心方向
///和长度,不关心(位置)起点终点 ///矢量的基本运算
CVector operator + (CVector p, CVector q)///矢量和
{
return CVector(p.x + q.x, p.y + q.y);
} CVector operator -(CVector p, CVector q)
{
return CVector(p.x - q.x, p.y - q.y);
} CVector operator *(double k, CVector p)
{
return CVector(k * p.x, k * p.y);
} ///矢量的点积
///性质:p·q=|p||q|cos<p,q>
///a与b的点积,就是a的模乘以b在a上投影的模。若投影与a方向相反则为负值
///其值的正负表示方向
///功能:求同向还是异向;求投影;求出投影后用勾股定理求点到直线距离;
///若a * b = 0,则 a和b垂直
double operator *(CVector p, CVector q)
{
return p.x * q.x + p.y * q.y;
} ///矢量模长
///用矢量与自身点积求模
double length(CVector p)///求矢量的模
{
return sqrt(p * p);
} ///矢量单位化
///将矢量除以自身的长度以得到同方向的单位矢量
CVector unit(CVector p)
{
return / length(p) * p;
} ///矢量的投影长度
///矢量与该方向单位矢量的点积
///注意:负数表示反方向
double project(CVector p, CVector n)///点积
{
return dot(p, unit(n));
}
double dot(CVector p, CVector q)
{
return p.x*q.x+p.y*q.y;
} ///矢量的叉积
///性质:在二维情况中,|p×q|=|p||q|sin<p,q>
///功能:求面积;求顺时针方向还是逆时针方向;判断是否在半平面上
///用法:c = a ^ b; //a,b,c都是CVector对象
///a×b 为有向面积,可正可负。
///若a逆时针旋转小于180度可到b,则结果为正,否则结果为负
double operator ^(CVector p, CVector q)
{
return p.x * q.y – q.x * p.y;
} ///两个矢量所围成的三角形的面积
///两个矢量的叉积的一半
///注意:得到的面积为有向面积,可能为负
double area(CVector p, CVector q)
{
return p^q / ;
}
代码
矢量的点积:

未完...
ACM北大暑期课培训第八天的更多相关文章
- ACM北大暑期课培训第一天
今天是ACM北大暑期课开课的第一天,很幸运能参加这次暑期课,接下来的几天我将会每天写博客来总结我每天所学的内容.好吧下面开始进入正题: 今天第一节课,郭炜老师给我们讲了二分分治贪心和动态规划. 1.二 ...
- ACM北大暑期课培训第七天
昨天没时间写,今天补下. 昨天学的强连通分支,桥和割点,基本的网络流算法以及Dinic算法: 强连通分支 定义:在有向图G中,如果任意两个不同的顶点 相互可达,则称该有向图是强连通的. 有向图G的极大 ...
- ACM北大暑期课培训第六天
今天讲了DFA,最小生成树以及最短路 DFA(接着昨天讲) 如何高效的构造前缀指针: 步骤为:根据深度一一求出每一个节点的前缀指针.对于当前节点,设他的父节点与他的边上的字符为Ch,如果他的父节点的前 ...
- ACM北大暑期课培训第二天
今天继续讲的动态规划 ... 补充几个要点: 1. 善于利用滚动数组(可减少内存,用法与计算方向有关) 2.升维 3.可利用一些数据结构等方法使代码更优 (比如优先队列) 4.一般看到数值小的 (十 ...
- ACM北大暑期课培训第五天
今天讲的扫描线,树状数组,并查集还有前缀树. 扫描线 扫描线的思路:使用一条垂直于X轴的直线,从左到右来扫描这个图形,明显,只有在碰到矩形的左边界或者右边界的时候,这个线段所扫描到的情况才会改变, ...
- ACM北大暑期课培训第四天
今天讲了几个高级搜索算法:A* ,迭代加深,Alpha-Beta剪枝 以及线段树 A*算法 启发式搜索算法(A算法) : 在BFS算法中,若对每个状态n都设定估价函数 f(n)=g(n)+h(n) ...
- ACM北大暑期课培训第三天
今天讲的内容是深搜和广搜 深搜(DFS) 从起点出发,走过的点要做标记,发现有没走过的点,就随意挑一个往前走,走不 了就回退,此种路径搜索策略就称为“深度优先搜索”,简称“深搜”. bool Dfs( ...
- 2019暑期北航培训—预培训作业-IDE的安装与初步使用(Visual Studio版)
这个作业属于那个课程 2019北航软件工程暑期师资培训 这个作业要求在哪里 预培训-IDE的安装与初步使用(Visual Studio版) 我在这个课程的目标是 提高自身实际项目实践能力,掌握帮助学生 ...
- 01派【北京大学ACM/ICPC竞赛训练暑期课】
01:派 总时间限制: 1000ms 内存限制: 65536kB 描述 我的生日要到了!根据习俗,我需要将一些派分给大家.我有N个不同口味.不同大小的派.有F个朋友会来参加我的派对,每个人会拿到一 ...
随机推荐
- HTML静态网页--表单验证和事件
1.表单验证<form></form> (1).非空验证(去空格) (2).对比验证(跟一个值对比) (3).范围验证(根据一个范围进行判断) (4).固定格式验证:电话号码, ...
- supersockets单个 listener
在下面的配置中,你可以配置服务器的监听 ip/port: <superSocket> <servers> <server name="TelnetServer& ...
- Java中的元注解
注解为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某个时刻非常方便地使用这些数据. 通过使用注解,我们可以将这些元数据保存在Java源代码中,并利用annotation API为自己的 ...
- electron-vue 窗口拖拽及自定义边框,及关闭缩小放大化方法
1.窗口的最小化按钮和关闭按钮以及标题栏自定义,不使用 electron 自身携带的原生标题栏 在src文件夹下main下index.js文件添加 mainWindow = new BrowserWi ...
- 【u201】矩形覆盖
Time Limit: 1 second Memory Limit: 128 MB [问题描述] 有N个矩形,矩形的底边边长为1,且均在X轴上,高度给出,第i个矩形的高为h[i],例如h = [3, ...
- linux vmalloc 和 其友
我们展示给你的下一个内存分配函数是 vmlloc, 它在虚拟内存空间分配一块连续的内存 区. 尽管这些页在物理内存中不连续 (使用一个单独的对 alloc_page 的调用来获得每个 页), 内核看它 ...
- js实现instanceof
instanceof 是通过原型链判断的,A instanceof B, 在A的原型链中层层查找,是否有原型等于B.prototype,如果一直找到A的原型链的顶端null,仍然不等于B.pr ...
- LuoguP3066 逃跑的BarnRunning Away From…
LuoguP3066 先吐槽一下,这道题名字好长啊 一个非常明显的思路,利用倍增数组不断向上跳.直到数值大于\(L\),然后直接差分统计答案就好了. 这种ZROI也考过,不多赘述了. 我们来考虑主席树 ...
- koa2实现简单的验证码
//首先引入svg-captcha,https://www.npmjs.com/package/svg-captcha const svgCaptcha = require('svg-captcha) ...
- C#面试题整理2(不带答案)
一.C# 理论 1.1.简述 private. protected. public. internal.protected internal 访问修饰符和访问权限 1.2.简述abstract.sea ...