NOIP Practice recordings GT

Gragh Theory

kruskal

luogu4768 NOI2018T1 归程

  (2022.3.12)

  给一张无向连通图,每个点有一个水位。每天我们要把走的路径分成两部分,一部分开车,另一部分走路(水位低于今天水位的点只能走路),然后要求我们走路的边权和最小(每天的初始位置和水位线不一样)。

  假设当前断点为 u u u。若取 u u u 是最优的显然要满足一下几个性质:

  1. 存在一条从 v v v u u u 的路径且在这条路径上都能开车(海拔足够高)
  2. u u u 1 1 1 的路经长度是最短的(很显然的单元最短路)

  所以我们很容易能想到运用 kruskal 重构树来解决这个问题(如果你不知道 kruskal 重构树是什么可以看这里:kruskal 重构树)。显然在这里我们根据边的海拔降序排列建立重构树,对于每个询问我们找到深度最小且海拔大于水位线的节点。那这显然个节点的子树中所有的节点都可以从 v v v 开车到达(因为子树的海拔要比父亲的大)。

  求解深度最小且海拔大于水位线的节点可以用倍增来实现。然后就对子树中的所有节点到 1 1 1 的最短路(在之前预处理出来就行啦,但是注意不要用 SPFA qwq)比个大小(在树上 dfs)就能得出答案了。

WOJ10028 贸易

  (2022.4.3)

  就是给定一个无向图,然后让你保证每个边都有且仅有 1 1 1 的入度。也就是转化成最小生成基环树森林。显然我们只需要把 k r u s k a l kruskal kruskal 稍微改造一下,也就是换一下判断是否加边的条件就能过掉这个题了:

  我们考虑怎样加边来维护基环树森林。判断一条边能否加入的时候,如果这两个端点已经连通了,我们就需要知道这个连通块是否有环,如果没有环就连在一起,并标记他现在有环。如果不连通,那么还是判断两个有没有环。如果都有环就不加边,否则就加边并且标记两边是否有环。

bipartite graph

一些前置芝士

  在二分图 G = ( V , E ) G =(V, E) G=(V,E) 中,规定边集 M ∈ E M \in E ME 表示最大匹配,边集 F ∈ E F \in E FE 表示最小边覆盖, 点集 S 1 ∈ V S_1 \in V S1V 表示最大独立集, S 2 ∈ V S_2 \in V S2V 表示最小顶点覆盖。

  1. 边覆盖表示任意定边至少是 F F F 中某条边的端点的边集。
  2. 独立集表示两两互不相连的定点集合 S 1 S_1 S1
  3. 顶点覆盖表示任何一条边都至少有一个端点在 S 2 S_2 S2 中。

  然后我们就有:

∣ M ∣ + ∣ F ∣ = ∣ V ∣ ∣ S 1 ∣ + ∣ S 2 ∣ = ∣ V ∣ ∣ M ∣ = ∣ S 2 ∣ \begin{aligned} |M| +|F| & = |V| \\ |S_1| +|S_2| & = |V| \\ |M| & = |S_2| \end{aligned} M+FS1+S2M=V=V=S2

  注意前两个式子在任意图中都成立,第三个式子只在二分图中成立。所以在二分图中,我们还能得到:

∣ M ∣ + ∣ S 1 ∣ = ∣ V ∣ |M| + |S_1| = |V| M+S1=V

luogu3386 二分图最大匹配

  (2022.4.2)

  板子题,直接 b f s bfs bfs 找增广路然后每次取反直到找不到为止就是最大匹配了(匈牙利)。

luogu4304 攻击装置

  (2022.4.2)

  给一个 n × n n \times n n×n 的中国象棋棋盘,然后给定一些地方可以放置一个 马 马 ,然后求能在棋盘上放置的最多的马的数量,并保证这些马不会相互共计(马走 “日” 大家应该都知道吧 qwq)。

  考虑构图,如果两个点之间马可以相互到达就连一条边,那么就是要求这个无向图的最大独立集 S 1 S_1 S1。但是一般图的最大独立集是一个 N P C NPC NPC 问题,所以我们考虑证明我们构造出来的图是一个二分图。

  如果我们对这个棋盘进行染色,像这样:

在这里插入图片描述
  我们就能发现能连边的肯定都是不同颜色的两个点,所以是一个二分图,就能二分图最大匹配了。然后我们在二分图中又有:

∣ S 1 ∣ = ∣ V ∣ − ∣ M ∣ |S_1| = |V| - |M| S1=VM

  然后就做完了。

web flow

tarjan

tree

NOIP2015 运输计划

  (2022.5.28)

  考虑二分答案,现在的问题就是如何实现 c h e c k ( x ) check(x) check(x)

  考虑找到一条边,使得路径长度大于 x x x 的所有路径都有这条边,并且减去这条边的边权之后路径长度小于等于 x x x

  所以我们就先用 l c a lca lca 预处理出所有路径的长度,然后对于每一个 x x x,记录每条边有多少原长超过 x x x 的路径经过(树上差分,路径覆盖),再遍历一遍整棵树找到有没有满足条件的边就可以了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值