ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

网络流

2021-01-16 16:02:56  阅读:326  来源: 互联网

标签:网络 女友 饮料 建图 wyc 飞行员


基础知识

网上博客有很多,这里就没必要再赘述了。

贴一份 \(yxc\) 的笔记:

1. 基本概念
    1.1 流网络,不考虑反向边
    1.2 可行流,不考虑反向边
        1.2.1 两个条件:容量限制、流量守恒
        1.2.2 可行流的流量指从源点流出的流量 - 流入源点的流量
        1.2.3 最大流是指最大可行流
    1.3 残留网络,考虑反向边,残留网络的可行流f' + 原图的可行流f = 原题的另一个可行流
        (1) |f' + f| = |f'| + |f|
        (2) |f'| 可能是负数
    1.4 增广路径
    1.5 割
        1.5.1 割的定义
        1.5.2 割的容量,不考虑反向边,“最小割”是指容量最小的割。
        1.5.3 割的流量,考虑反向边,f(S, T) <= c(S, T)
        1.5.4 对于任意可行流f,任意割[S, T],|f| = f(S, T)
        1.5.5 对于任意可行流f,任意割[S, T],|f| <= c(S, T)
        1.5.6 最大流最小割定理
            (1) 可以流f是最大流
            (2) 可行流f的残留网络中不存在增广路
            (3) 存在某个割[S, T],|f| = c(S, T)
    1.6. 算法
        1.6.1 EK O(nm^2)
        1.6.2 Dinic O(n^2m)
    1.7 应用
        1.7.1 二分图
            (1) 二分图匹配
            (2) 二分图多重匹配
        1.7.2 上下界网络流
            (1) 无源汇上下界可行流
            (2) 有源汇上下界最大流
            (3) 有源汇上下界最小流
        1.7.3 多源汇最大流

最大流

个人认为比较重要的几个点就是:

  • 建的是原图的残留网络

每次增大就相当于减小残留网络中的容量。

  • 分层思想

保证流的顺序。

  • 当前弧优化

别的我不知道,我只知道如果没有它你会死翘翘。

详细分析也不讲啦,这里推荐一篇证明博客 -> 出门右转

模板点这里

费用流

费用流是基于网络流,只是多了一个费用的条件限制。

算法核心应该就是利用 \(spfa\) 可以处理负权的功能进行最短路。

注意点:

  • 流量处理时要注意一定是“照顾弱小”。但是初始值为 \(inf\)。

  • 利用链式前向星的特性记录路径就很妙

模板点这里

建图总结

其实大家都可以发现,网络流难点在于建图,只要把图建对,走遍天下都不怕。

然而建图都是有规律可循的,所以总结一发。

一、常规建图(又名直接来)

现在一般都不会出现直接建图的情况了。。。

一共有 \(n\) 个飞行员,其中有 \(m\) 个外籍飞行员和 \((n - m)\) 个英国飞行员,外籍飞行员从 \(1\) 到 \(m\) 编号英国飞行员从 \(m + 1\) 到 \(n\) 编号。 对于给定的外籍飞行员与英国飞行员的配合情况,试设计一个算法找出最佳飞行员配对方案,使皇家空军一次能派出最多的飞机。

\(Solution\):

直接将外籍飞行员和可以配合的英国飞行员连边, 每个外籍向源点,英籍向汇点连容量为1的边,以控制每人只能配对一次。

建图

	for(rt i = 1; i <= m; i ++) add(s,i,1);
	for(rt i = m + 1; i <= n; i ++) add(i,t,1);
	read(a), read(b);
	while(~a && ~b) {
		add(a,b,1);
		read(a),read(b);
	}

某学校要召开一个舞会。已知学校所有 \(n\) 名学生中,有些学生曾经互相跳过舞。当然跳过舞的学生一定是一个男生和一个女生。在这个舞会上,要求被邀请的学生中的任何一对男生和女生互相都不能跳过舞。求这个舞会最多能邀请多少个学生参加。

\(Solution\):

反向思考,题目要求最多邀请人数,其实就是求最小不邀请人数,那么就转化成了求所有相互跳过舞的人中的最小割

注意,因为题目没有给定男女生的具体情况,所以要先做染色处理,确定男女生,不同性别连向不同端点,跳过舞的一对就直接连边即可。

代码戳这里

二、拆点(网络流一大热点)

就不用介绍了吧。

主要是用来控制每个点的使用次数的。

FJ的奶牛们只吃各自喜欢的一些特定的食物和饮料,除此之外的其他食物和饮料一概不吃。某天FJ为奶牛们精心准备了一顿美妙的饭食,但在之前忘记检查奶牛们的菜单,这样显然是不能不能满足所有奶牛的要求。但是FJ又不愿意为此重新来做,所以他还是想让尽可能多的牛吃到他们喜欢的食品和饮料。FJ提供了F (编号为1、2、…、F)种食品并准备了D (编号为1、2、…、D)种饮料, 他的N头牛(编号为1、2、…、N)都已决定了是否愿意吃某种食物和喝某种饮料。FJ想给每一头牛一种食品和一种饮料,使得尽可能多的牛得到喜欢的食物和饮料。每一种食物和饮料只能由一头牛来用。例如如果食物2被一头牛吃掉了,没有别的牛能吃到食物2。

\(Solution\):

传统思路,将食物、牛、饮料按顺序建成网络流,但是因为控制了数量,所以将奶牛割成两个点,前一个点连源点,后一个点连汇点,两个点之间连容量为1的边,就能保证每头牛只消耗一份食物和饮料。
代码戳这里

三、分点(自定义)

其实我也不知道这个东东叫啥。

特点:利用题目给定的连边条件,将不同情况的点连向不同端点(感性理解一下)。

第一行给出数字N,M代表行列数.N,M均小于等于100,宝石的价值不会超过10000.下面N行M列用于描述数字矩阵

\(Solution\):

稍微观察就会发现,每个格点与他周围的四个格点的坐标和奇偶性不同,说明相同奇偶性的格点不会相互排斥,也就是可以同时选。所以将不同奇偶性连向不同端点就好了。

如果坐标和为偶数(因为偶数与汇点相连),从当前点向周围四个点连边,边权为正无穷,意为连接的两个点不能同时选择。

代码戳这里

wyc想出一道二分图(最大流),于是他找了女友们
单身多年的wyc终于找到了女朋友,而且一次性找到了\(inf\)个,wyc很喜欢她们里的所有人,但是害怕她们之间互相争斗导致自己后宫着火,wyc又十分喜欢挑战人类极限,想让一片街区有最多的女友可以让他肆意妄为,为了满足他的欲望,他找到了你来请你帮帮他。街区中的一个位置可以看做一个点。由于看上了wyc,wyc的女友们视野变得十分奇怪,她们只能看到目字型的位置,例如:如果她在点(5,5)上,她可以看到(6,8),(8,6)....(共八个)的点,如果wyc的一个女友看到了他的其他女友,那么她就会意识到wyc不仅有一个女友,wyc就会遭到迫害。现在wyc的女友们都在逛gai,已知街区大小为\(n*m\)(棋盘),其中有\(k\)个点没有wyc的女友,请问这条街区上最多可以有多少wyc的女友。

n70Hmt.jpg

\(Solution\):

做题思维不能太固化,我拿到题就直接用坐标和建边,但是肯定是错的。观察图片,我们发现人所在的位置与她所能看见的位置的横、纵坐标的奇偶性各不相同,所以利用横或纵坐标来建边即可。

代码戳这里

四、位置建边

其实就是将二维图转化成一维建图。

-----$ It$ \(will\) \(be\) \(finished\) \(soon\)......-------------

标签:网络,女友,饮料,建图,wyc,飞行员
来源: https://www.cnblogs.com/Spring-Araki/p/14286267.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有