8月清北学堂培训 Day6

今天是杨思祺老师的讲授~

图论

双连通分量

在无向图中,如果无论删去哪条边都不能使得 u 和 v 不联通, 则称 u 和 v 边双连通;

在无向图中,如果无论删去哪个点(非 u 和 v)都不能使得 u 和 v 不联通,则称 u 和 v 点双连通。

u 到 v 的路径没有必经边和必经点

割点:删去该点,图分裂为多个连通块。

割边:也叫 “ 桥 ”,删去该边,图分裂为多个连通块。

点双连通分量

类似地,定义 dfnu 和 lowu。 如果 v 是 u 的子结点,并且 lowv ≥ dfnu 则点 u 是割点,删去 点 u 后 v 子树和其它点不连通。 每个割点属于多个点双连通分量,非割点只属于一个点双连通分量。

边双连通分量

类似地,定义 dfnu 和 lowu。 如果 v 是 u 的子结点,并且 lowv > dfnu 则边 < u, v > 是割边。 每个点属于一个边双连通分量,边双连通分量之间以割边连接。

洛谷P3469 [POI2008]BLO-Blockade

在Byteotia有 n 个城镇。 一些城镇之间由无向边连接。 在城镇外没有十字路口,尽管可能有桥,隧道或者高架公路(反正不考虑这些)。每两个城镇之间至多只有一条直接连接的道路。人们可以从任意一个城镇直接或间接到达另一个城镇。 每个城镇都有一个公民,他们被孤独所困扰。事实证明,每个公民都想拜访其他所有公民一次(在主人所在的城镇)。所以,一共会有 n *(n-1)次拜访。

不幸的是,一个程序员总罢工正在进行中,那些程序员迫切要求购买某个软件。

作为抗议行动,程序员们计划封锁一些城镇,阻止人们进入,离开或者路过那里。

正如我们所说,他们正在讨论选择哪些城镇会导致最严重的后果。

编写一个程序:

读入Byteotia的道路系统,对于每个被决定的城镇,如果它被封锁,有多少访问不会发生,输出结果。

题解:

如果我们删去的不是割点,那么答案是 2 ( n-1 )(别人无法到自己,自己无法到别人);

那如果我们删去的是割点,那么答案就是每个点双联通分量的大小的乘积 。(规模最大为 O ( n ) ) 

POJ 3177

给定一个无向连通图,问添加几条边可以使它变成一个双连通图。

题解:

二分图

二分图

二分图:点黑白染色,邻点不同色。

二分图判定

如何判断一个给定的无向图是不是二分图?

从任意一点开始 BFS 或 DFS,起点不妨染色为白;

当前在 u 点时,尝试将所有邻点染为不同的颜色;

如果邻点已经染色且颜色不符,则不是二分图;

二分图的等价条件

无向图是二分图当且仅当其不包含奇环。

二分图匹配 

匹配:选取一些边,使得任意两条边没有公共点(每个点至 多属于一条边); 

最大匹配:选取边数尽可能多;

完美匹配:所有点都在匹配中(每个点恰好属于一条边) ;

匹配边:选中的边; 

非匹配边:没有选中的边; 

匹配点:和选中边相连的点; 

非匹配点:和选中边不相连的点; 

常常将二分图的点画成两列;

二分图最大匹配

二分图最大匹配是一个常见问题。 

匈牙利算法 

网络流

匈牙利算法

理论基础 :

交错路:从非匹配点出发,依次经过非匹配边、匹配边、非匹配边 ... ;

非匹配边恰好比匹配边多一个;然后我们交换非匹配边和匹配边就是使答案更优;

增广路:从非匹配点出发,结束于非匹配点的交错路;

增广路定理:任意一个非最大匹配的匹配一定存在增广路;

网络流 

取额外的两个点作为源点和汇点;

源点向左边一列每个点连流量为 1 的边;

右边一列每个点向汇点连流量为 1 的边;

二分图中每条边从左向右连流量为 1 的边;

求最大流即可 。

网络流的最小割等于最大流。

最小顶点覆盖 Knoig 定理

二分图最小顶点覆盖数等于其最大匹配数。

POJ 3041 Asteroids

一个 N × N 的网格中,有 K 个大小为 1 × 1 的小行星,现在可以用激光枪每次消灭一行的小行星或者消灭一列的小行星。问最少需要使用多少次激光枪消灭所有的小行星。

题解:

每行为左边一点;

每列为右边一点;

每个小行星为一边;

选择最少的点覆盖所有边;

最小路径覆盖

给定有向图 G < V, E >。设 P 是 G 的一个简单路(顶点不相交)的集合。如果 V 中每个顶点恰好在 P 的一条路上,则称 P 是 G 的一个路径覆盖。P 中路径可以从 V 的任何一个顶点开始, 长度也是任意的,特别地,可以为 0 。G 的最小路径覆盖是 G 的 所含路径条数最少的路径覆盖。

最小路径覆盖 = |V| - 二分图最大匹配

二分图:将原图每个点拆分为入点和出点,如果原图存在 u 到 v 的边,则在 u 的出点和 v 的入点间连无向边。

BZOJ 2150 部落战争

lanzerb 的部落在 A 国的上部,他们不满天寒地冻的环境,于是准备向 A 国的下部征战来获得更大的领土。A 国是一个 M × N 的矩阵,其中某些地方是城镇,某些地方是高山深涧无人居住。 lanzerb 把自己的部落分成若干支军队,他们约定:

1. 每支军队可以从任意一个城镇出发,并只能从上往向下征战,途中只能经过城镇,可以在任意一个城镇停止征战。

2. 每个城镇只能被一支军队经过。

3. 行军方式类似国际象棋中的马,不过只能走 R × C 的路线。

lanzerb 的野心使得他的目标是统一全国,但是兵力的限制使得他们在配备人手时力不从心。假设他们每支军队都能顺利占领这支军队经过的所有城镇,请你帮 lanzerb 算算至少要多少支军队 才能完成统一全国的大业。

题解:

最小路径覆盖问题,转化成求最大二分图匹配。

差分约束

差分约束可以确定特定的不等式组是否存在解。 

xi1 − xj1 ≤ a1 

xi2 − xj2 ≤ a2 

. . .

为每个变量 xi 建立一个点 pi。 # 如果要求 xi − xj ≤ a,则建立一条从 pj 到 pi 长度为 a 的边;

以任意一点为起点求单源最短路,则一定有 di − dj ≤ a 如果出现负环,则归结出形如 xi − xi < 0 的约束,不等式组无解。 如果没有负环,最短路算法得到的距离数组就是一组合法的解。

BZOJ 2330 糖果

幼儿园里有 N 个小朋友,lxhgww 老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果。但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的多,于是在分配糖果的时候,lxhgww 需要满足小朋友们的 K 个要求。幼儿园的糖果总是有限的,lxhgww 想知道他至少需要准备多少个糖果,才能使得每个小朋友都能够分到糖果,并且满足小朋友们所有的要求。 N ≤ 100000, K ≤ 100000 。

每个限制为三个整数:X, A, B。

如果 X = 1,表示第 A 个小朋友分到的糖果必须和第 B 个小 朋友分到的糖果一样多; 

如果 X = 2,表示第 A 个小朋友分到的糖果必须少于第 B 个 小朋友分到的糖果; 

如果 X = 3,表示第 A 个小朋友分到的糖果必须不少于第 B 个小朋友分到的糖果; 

如果 X = 4,表示第 A 个小朋友分到的糖果必须多于第 B 个 小朋友分到的糖果; 

如果 X = 5,表示第 A 个小朋友分到的糖果必须不多于第 B 个小朋友分到的糖果;

题解:

易见每种限制都可以表示为差分约束形式的不等式。 因为每个小朋友得到的糖果数至少为 1,要求最少总糖果数,所 以设置超级源点,向每个点连长度为 1 的边,跑单源最长路即可。

BZOJ 1202 狡猾的商人

刁姹接到一个任务,为税务部门调查一位商人的账本,看看账本 是不是伪造的。账本上记录了 n 个月以来的收入情况,其中第 i 个月的收入额为 A( i = 1,2,3...n-1,n),。当 Ai 大于 0 时表示这个 月盈利 Ai 元,当 Ai 小于 0 时表示这个月亏损 Ai 元。所谓一段时间内的总收入,就是这段时间内每个月的收入额的总和。刁姹的任务是秘密进行的,为了调查商人的账本,她只好跑到商人那里打工。她趁商人不在时去偷看账本,可是她无法将账本偷出来,每次偷看账本时她都只能看某段时间内账本上记录的收入情况,并且她只能记住这段时间内的总收入。现在,刁姹总共偷看了 m 次账本,当然也就记住了 m 段时间内的总收入,你的任务是根据记住的这些信息来判断账本是不是假的。

题解:

以 Si 表示 Ai 的前缀和,则每个限制形如 Su − Sv = k,将其拆分为两个不等式:

Su − Sv ≤ k 

Su − Sv ≥ k 即 Sv − Su ≤ −k 差分约束后如果出现负环,则信息有假(会出现 Si - Si < 0 的情况)。

当然,对于这种全部为等式的差分约束问题,用 DFS 或 BFS 判 断即可,不需要应用最短路算法。

BZOJ 4500 矩阵

有一个 n × m 的矩阵,初始每个格子的权值都为 0,可以对矩阵 执行两种操作:

1. 选择一行,该行每个格子的权值加 1 或减 1。

2. 选择一列,该列每个格子的权值加 1 或减 1。 现在有 K 个限制,每个限制为一个三元组 ( x , y , c ),代表格子 ( x , y ) 权值等于 c。问是否存在一个操作序列,使得操作完后的矩 阵满足所有的限制。如果存在输出 ” Yes ”,否则输出 ” No ”。

题解:

建立 n 个点,a1, a2, . . . , an,代表每一行的操作效果。 建立 m 个点,b1, b2, . . . , bm,代表每一列的操作效果。 对于限制 ( x , y , c ),强制 ax + by = c 即可,可以视为一条边。

DFS 或 BFS 判断即可。

猜你喜欢

转载自www.cnblogs.com/xcg123/p/11334303.html
今日推荐