今天学了有流量下界的网络最大流,最小费用最大流,计算几何。

  有流量下界的网络最大流  

  如果流网络中每条边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北大暑期课培训第八天的更多相关文章

  1. ACM北大暑期课培训第一天

    今天是ACM北大暑期课开课的第一天,很幸运能参加这次暑期课,接下来的几天我将会每天写博客来总结我每天所学的内容.好吧下面开始进入正题: 今天第一节课,郭炜老师给我们讲了二分分治贪心和动态规划. 1.二 ...

  2. ACM北大暑期课培训第七天

    昨天没时间写,今天补下. 昨天学的强连通分支,桥和割点,基本的网络流算法以及Dinic算法: 强连通分支 定义:在有向图G中,如果任意两个不同的顶点 相互可达,则称该有向图是强连通的. 有向图G的极大 ...

  3. ACM北大暑期课培训第六天

    今天讲了DFA,最小生成树以及最短路 DFA(接着昨天讲) 如何高效的构造前缀指针: 步骤为:根据深度一一求出每一个节点的前缀指针.对于当前节点,设他的父节点与他的边上的字符为Ch,如果他的父节点的前 ...

  4. ACM北大暑期课培训第二天

    今天继续讲的动态规划 ... 补充几个要点: 1. 善于利用滚动数组(可减少内存,用法与计算方向有关) 2.升维 3.可利用一些数据结构等方法使代码更优  (比如优先队列) 4.一般看到数值小的 (十 ...

  5. ACM北大暑期课培训第五天

    今天讲的扫描线,树状数组,并查集还有前缀树. 扫描线   扫描线的思路:使用一条垂直于X轴的直线,从左到右来扫描这个图形,明显,只有在碰到矩形的左边界或者右边界的时候,这个线段所扫描到的情况才会改变, ...

  6. ACM北大暑期课培训第四天

    今天讲了几个高级搜索算法:A* ,迭代加深,Alpha-Beta剪枝   以及线段树 A*算法 启发式搜索算法(A算法) : 在BFS算法中,若对每个状态n都设定估价函数 f(n)=g(n)+h(n) ...

  7. ACM北大暑期课培训第三天

    今天讲的内容是深搜和广搜 深搜(DFS) 从起点出发,走过的点要做标记,发现有没走过的点,就随意挑一个往前走,走不 了就回退,此种路径搜索策略就称为“深度优先搜索”,简称“深搜”. bool Dfs( ...

  8. 2019暑期北航培训—预培训作业-IDE的安装与初步使用(Visual Studio版)

    这个作业属于那个课程 2019北航软件工程暑期师资培训 这个作业要求在哪里 预培训-IDE的安装与初步使用(Visual Studio版) 我在这个课程的目标是 提高自身实际项目实践能力,掌握帮助学生 ...

  9. 01派【北京大学ACM/ICPC竞赛训练暑期课】

    01:派 总时间限制:  1000ms 内存限制:  65536kB 描述 我的生日要到了!根据习俗,我需要将一些派分给大家.我有N个不同口味.不同大小的派.有F个朋友会来参加我的派对,每个人会拿到一 ...

随机推荐

  1. H3C V.35接口线缆

  2. JAVA之NIO按行读写大文件,完美解决中文乱码问题

    ;//一次读取的字节长度 File fin = new File("D:\\test\\20160622_627975.txt");//读取的文件 File fout = new  ...

  3. css超出盒子隐藏

    效果如图1-1. 效果图1-1 css代码: white-space: nowrap;overflow: hidden; text-overflow: ellipsis; display: inlin ...

  4. Java Annotation详解(二): 反射和Annotation

    前面一篇文<Java Annotation详解(一): 理解和使用Annotation>中,我们或许会觉得,Annotation注释其实并没有多大的作用,除了几个内建的Annotation ...

  5. codedecision P1112 区间连续段 题解 线段树

    题目描述:https://www.cnblogs.com/problems/p/P1112.html 题目链接:http://codedecision.com/problem/1112 线段树区间操作 ...

  6. git查看当前分支所属

    1.git branch -vv 2.git config --lis

  7. Python--day46--mysql存储过程(不常用)(包含防sql注入)

    一.存储过程: 优点:只要传很少的数据到数据库就可以了  缺点:dba管理数据库的时候可能会对数据库进行了更改了那一坨sql语句. 二.创建存储过程: 1.简单 创建存储过程: Python中使用结果 ...

  8. 地址中如果含有"+",发给服务器时"+"变成了空格问题解析

    如地址为sms:+7 915 444-414-444,含有空格. 服务器解码 URLDecoder.decode("sms:+7 915 444-414-444"),返回的是sms ...

  9. PhpStorm terminal无法输入命令的解决方法

    下面小编就为大家带来一篇PhpStorm terminal无法输入命令的解决方法.小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧   在使用PhpStorm时,点击下面的 ...

  10. The 10th Shandong Provincial Collegiate Programming Contest H.Tokens on the Segments(贪心+优先级队列 or 贪心+暴力)

    传送门 •题意 二维平面上有 n 条线段,每条线段坐标为 $(l_i,i),(r_i,i)$: 平面上的每个整点坐标上都可以放置一枚硬币,但是要求任意两枚硬币的横坐标不相同: 问最多有多少条线段可以放 ...