Graph Theory

cryime

Q&A

  • Q:你改名字了?
  • Prime21:嗯哼?
  • Q:为什么啊?
  • Prime21:我开心!
  • Q:图论要学什么啊?
  • Prime21:啊。我不会图论,听说只要会:线段树套平衡树套替罪羊树套喜羊羊树套圣诞树套可持久化动态仙人掌就可以。
  • Q:我也不会怎么办啊。
  • Prime21:我也不会怎么办啊。听说树套树套树套树套树的复杂度是O((n+q)log^5(m))。还不如暴力。

Warm-Up

n 个点的有标号无向图,每个点的度数均为偶数的有多少个?

2^{ \binom{n-1}{2}}
2(n12)2^{ \binom{n-1}{2}}

proof:就是n-1个点的图的个数,其他点考虑奇偶性和最后一个点连边,根据握手定理,最后一个点的度数也是偶数。

欧拉回路

  1. 无向图欧拉回路
  2. 无向图欧拉路径
  3. 有向图欧拉回路
  4. 有向图欧拉路径
  5. 混合图欧拉回路

相信大家都会

Easy

消失的迷宫

  doge的家中有一个硕大的迷宫。

  N个点的有向图,这是一个会逐渐消失的迷宫,当你经过一条路的时候,这条路,便会消失。迷宫的出口在N号节点,你将从1号节点出发。

  doge也会把这个点变成出口。现在要你走出这个迷宫,如果有多组方案,输出一组即可。

 

Easy

消失的迷宫

一句话题意:走一条路,一条边只能走一次,使得在无路可走的时候,要么是没有停在n点,要么是没有遍历所有的边。

纯图论题一般都需要分情况讨论讨论。

问题的关键在于是否是一张半欧拉图。

1.如果不是半欧拉图,随便dfs一条路即可。

2.如果是欧拉图,走这条欧拉回路即可。

3.如果是半欧拉图,

            如果起点不是1,还是瞎dfs即可。

            如果起点是1,终点不是n,那么按照这条欧拉路走即可,

            如果终点是n,考虑把连向终点的边断开,判断是否有环,如果有环,把环删去,然后走回路,否则无解。

Medium

图的色数

  众所周知,图的色数问题是NP-complete的。但是不妨碍我们对于染色的爱好。我们定义一个图的k染色是说,对这个图的每一个节点标上一个1~k的标号,满足相邻两个点的标号不同。我们定义有向图的二色数,而色数是说对这张图进行k染色时,满足每一个对颜色都至少对应在一条边上。不妨你可以认为这个问题还是NP-complete的。

  noname随口一说,我会一个环,于是随手画了一个12个点的环给pulumi看,N=12时候的环的二色数不就是5麽。现在要你求出大小N(<=1000)的环的二色数。

Medium

图的色数

  事实证明,最后一个问题不是NPC的,二色数这个说法是我定义的,不知道求任意图的二色数是不是NPC的。不过这些问题都是N-prime21-Complete的。

  本题的做法是一个精妙的构造。

  先思考这个问题的对偶问题。如果已知二色数为k。我们至少需要多少个点呢?考虑我们如果不浪费任何一条,那么我们大可这样,对于每一个颜色向一半的颜色连边,另一半的颜色向它连边。对于颜色 k我们需要的边(点)数是       

  所以我们肯定可以确定这个图最多的染色数k。

  1.              ,考虑这个图他本来就是欧拉图。我们把欧拉回路跑出来就行。

  2.                   ,我们考虑无论如何补一条边,你都把原来那个唯一的边给炸掉了。所以只好k-1。其余奇怪直接补新的点就好。

k\lfloor \frac{k}{2} \rfloor
kk2k\lfloor \frac{k}{2} \rfloor
n=k\lfloor \frac{k}{2} \rfloor
n=kk2n=k\lfloor \frac{k}{2} \rfloor
n=k\lfloor \frac{k}{2} \rfloor+1
n=kk2+1n=k\lfloor \frac{k}{2} \rfloor+1

哈密顿回路

这是在搞笑

接到消息,你们媒体自身也要判断。

图的中心

来点noip向的东西冷静冷静

大家小学可能就会了。

Easy

  1. 边的中心:给出一个图,给出一条边。要求在上面找到一个点,使得到所有点的最短路的最大值最小。
  2. 图的中心:给出一个图。要求在上面找到一个点(允许不在顶点处),使得到所有点的最短路的最大值最小。
  3. 如何输出。输出它在某一条边上以及到某一个端点的距离

想二分?会错。我好像错了几次。

严格卡掉二分!要求输出分数解。

Easy

边的中心

  我们设这条边的长度为L,两个顶点为u,v。假如我们已经算出u,v为源点的SSSP,存在两个vector,disu,disv里面。设中心距离u为x那么,每一个点到中心的距离为min(disu[p]+x,disv[p]+L-x)。

以x为变量的话将是一条折线。考虑再对不同的点取个max就是取所有折线的并的最上方那条线的最小值。

所以正确姿势是按照disu给所有东西排个序,然后不断合并。

至于图的中心,并没有好的做法,枚举每条边求求中心就好。

Tarjan

  大老师Tarjan是当之无愧的学术帝,基本上我们现有的轮子都有他的影子,除了动静态仙人掌?

Q:Tarjan算法不是不是各位大爷爷们noip出的题么。你怎么还在讲啊。

Prime21:QwQ

Tarjan

ZJOI2007最大半连通子图

一个有向图 G=(V, E) 称为半连通的(Semi-Connected),如果满足图中任意两点 u v,存在一条从 u 到 v 的路径或者从 v 到 u 的路径

给一个有向图(n 个点,m 条边),求出她的最大半连通子图中所包含的点数,以及这样的最大半连通子图有多少个(要求模上一个给定的数 x)

Tarjan

ZJOI2007最大半连通子图

  这题其实也差不多的做法,先缩点,重新建图,使其成为一个 DAG,DAG 中每个点有一个点权表示这个点是原图中的几个点缩成的

  新图中的一个最大半连通子图,必然是新图中的一个最长链(点权和最大),知道了这点之后,DP 就行了,类似于树形 DP,先求出从每个点出发,能走的最长链是多长,统计最长的那条就是最大半连通子图的点的数量了,至于怎么求有多少个最大半连通子图,也是一样的 DP 就行,在上一步的 DP 之后,再 DP 一遍,统计每个点出发能走出多少条最长链,最后统计求和即可

Tarjan

预告

本来有一道脑洞打开的题目,现已卖给noname

Made with Slides.com