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个朋友会来参加我的派对,每个人会拿到一 ...
随机推荐
- 在Linux/Unix上运行SuperSocket
SuperSocket通过(Mono 2.10或更新版本)来实现跨平台的特性 由于Unix/Linux不同于Windows上的文件路径格式,SuperSocket提供了专用于Unix/Linux系统上 ...
- BraveOS正式版发布,希望大家下载使用
废话不多说,直接贴图才是王道 这里是DOS系统+默认官方(Platform系统) 下载地址:http://pan.baidu.com/s/1eQINwx8 (引导进Platform系统后,默认管理员帐 ...
- VisualStudio 使用多个环境进行调试
在 VisualStudio 2017 支持使用 launchSettings.json 文件定义多个不同的环境进行调试 先给大家一张图看一下效果 可以看到原来的是启动的按钮,现在被我修改为 lind ...
- 【codeforces 766C】Mahmoud and a Message
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- Linux创建用户、设置密码、修改用户、删除用户命令
与大家分享下Linux系统中创建用户.设置密码.修改用户.删除用户的命令,希望对你有所帮助. useradd testuser 创建用户testuserpasswd testuser 给已创建的用 ...
- 添加gitignore文件后使其生效
https://www.cnblogs.com/AliliWl/p/7880243.html 遇到的问题 我们发现在添加.gitignore文件后,当我们想push文件的时候,我们声明的忽略文件还是会 ...
- Ubuntu 19.04安装phpipam软件
1ftp下载xampp2安装xampp chmod 777sudo ./xampp.run3,ftp phpipam.tar.gz 解压 ./opt/lampp/www/phpipam/cp conf ...
- P1000 A+B Problem
题目描述 给定两个整数\(a,b\),输出它们的和. 输入格式 输入两个整数,表示\(a,b(1 \le a,b \le 10^9)\). 输出格式 输出一个整数,表示答案. 样例输入 20 30 样 ...
- PHP PDO扩展整理,包括环境配置\基本增删改查\事务\预处理
相关文章:PHP的mysql扩展整理,操作数据库的实现过程分析 PHPmysqli扩展整理,包括面向过程和面向对象的比较\事务控制\批量执行\预处理 介绍 PDO是一种PHP程序连接数据库的接口 ...
- P1025 最大完美度
题目描述 定义一个字符串的完美度为字符串中所有字符的完美度的和. 现在给你一个只含字母的字符串s, 每一个字母的完美度由你进行分配, 可以分配给一个字母[1,26]中的一个数字作为完美度, 但每个字母 ...