@SovietPower
        
        2019-05-04T00:37:15.000000Z
        字数 5512
        阅读 3787
    正睿OI 图论
有些东西不知道有什么用...但既然dls讲了就记记吧。很多东西来自国庆正睿 dls课件。 
把以前的写的合并到一篇了。 
也可以看这儿。
对于无向图,为每个点的度数。 
有(每条边被计算两次)。 
有偶数个度数为奇数的点。
给定一个由有限多个非负整数组成的度数序列,是否存在一个简单图使得其度数序列恰为这个序列。 
令为有限多个非负整数组成的非递增序列。 
可简单图化当且仅当有穷序列只含有非负整数且是可简单图化的。 
序列可简单图化是指存在一个无向图(无重边无自环),使得其度数序列恰为。 
(这个其实就是很显然的东西。。主要是一个定义)
令为有限多个非负整数组成的非递增序列。 
可简单图化当且仅当这些数字的和为偶数,且
对于任意都成立。 
也不难理解。对前个点分配度数,除了两两能连条边外,剩下的度数由后面点的度数补。 
因为非递增,从小到大枚举,维护后缀与取的和(都是单调的,维护从哪开始的结果是)。就可以判断了。
例题:Good Bye 2018 E(竟然真的遇到了),NEERC2013 K.Kids in a Friendly Class。
给定一张无向/有向图,求一条经过所有边恰好一次的回路。 
有解当且仅当所有点 度数为偶数(无向)/入度等于出度(有向)。 
任选一点开始dfs,每条边只经过一次。回溯时将回溯的边加入队列,最后队列的逆序就是答案。 
时间复杂度 . 
欧拉路径也可以用一样的方法求出(找度数为奇数的点进行DFS)。
欧拉回路:有向图:所有点的出度入度都相等;从任意一点都可实现。 
     无向图:所有点度数都为偶数。 
欧拉路:有向图:有两个点可以入度出度不相等(差不大于一),即起点终点;起点入度小于出度,终点入度大于出度 。 
    无向图:仅有两个点度数为奇数。  
注:必须为连通图(用并查集判断)。 
两笔画问题: 
有解当且仅当入度为奇数的点不超过四个。 
将其中两个点加一条边后求欧拉路径,然后在这条边处断开成两条欧拉路即可。 
时间复杂度 .
这个很全啊,可以看这儿。 
Defination: 
  Prufer序列是一种无根树的编码表示。 
  对于一棵个点的无根树,对应唯一一串长度为的序列。
  定义无根树中度数为的节点是叶子节点,每次找到编号最小的叶节点删除,在序列中添加与之相邻的点。如此重复直到剩下最后两个节点。 
 
  上图对应无根树的序列为。
  给定点集,序列。 
  每次取出序列中的第一个元素,在中找在当前序列中没有出现的第一个元素,在和间连一条边;将从序列中删除,从中删除。 
  最后中还剩下个元素,在这个元素间连一条边。
Cayley定理:完全图的生成树个数为。 
如果每个点的度数为,那么生成树个数为。 
每个连通块大小为,那么添加一些边将这些连通块连通的生成树个数为。
题集。
  无向图生成树计数:令(基尔霍夫矩阵=度数矩阵-边矩阵),然后去除的任意一行一列得到,的行列式即生成树个数。 
  有向图生成树计数:与无向图不同的是,矩阵为入度/出度矩阵分别对应外向树/内向树。且删掉第行第列表示以为根节点的生成树个数。
题集。
一开始每个连通分量是一个点本身。 
每轮枚举所有属于不同连通分量的边,每个连通分量选择和其他连通分量相连的最小的边,然后合并。 
每轮连通块个数至少减半,所以最多进行轮。时间复杂度。 
具体实现直接用并查集即可。代码可以看这里。
一般用来做边权与点权相关,还是个完全图,求MST的题? 
1. 有个点的完全图,每个点的权值为,两个点之间的边权为。求这张图的最小生成树。 
 
具体怎么做忘了。。你们结合下面的题脑补一下。 
2. CF888G。 
有一张个点的完全图,每个点的权值为,两个点之间的边权为。求该图的最小生成树。 
。
使得生成树树上最大边权值最小。 
方法1:最小生成树一定是最小瓶颈生成树。 
方法2:二分答案,看点是否连通。 
方法3: 
  类比找第k大值的方法(nth_element),首先随机一个边权。然后将不超过这个边权的边加入,遍历这张图。 
  如果图连通,那么瓶颈不超过,于是只需考虑边权不超过的边;否则将这些连通点缩起来,考虑边权大于的边。 
  每次将问题的规模缩小至一半。期望时间复杂度。
(贪心)或者(动态规划)。 
时间复杂度或者。
边权是:双端队列,如果是在头部插入,否则在尾部插入。 
最长路径不超过, 正权图:使用的桶+链表维护这些点(代替堆),时间复杂度。
复杂度。代码实现可以记录最短路树上的深度来判环,而不是入队次数,这样会有优化。
if(dis[v]>dis[u]+w)dis[v]=dis[u]+wdep[v]=dep[u]+1if(dep[v]>n) return;
大体过程:http://www.cppblog.com/menjitianya/archive/2015/11/19/212292.html 
考虑最短路中的松弛操作:if(dis[v]>dis[x]+w) dis[v]=dis[x]+w,也就是强制使得满足。 
所以对于的限制,可以连一条边。这样求的最大值,就是求的最短路。 
如果限制是,同理连边。的最小值就是求的最长路。 
如果两种限制都有,就把变成。 
解的存在性: 
比如求的最大值:若图中存在负环,则的最短路无穷小,则不存在最大值(无解)。 
若和就不在同一连通块,则的最短路无穷大,最大值无穷大(或者存在无数多解)。 
否则有解。 
PS: 
可以根据入队次数判负环,也可以据此判正环。虽然效率都不高就是了。 
不能求最长路(本质是贪心)。 
如何判断解唯一: 
对原图求一遍最短路。将原图取反,边权取反,求一遍最长路。 
一个标号对应的是能取到的最小值,一个是最大值。 
如果相同则解唯一。(没什么用)
题集。
: 
算法(可用于负权图):
原理:首先给图中每个点一个权值, 把每条边的边权改成。 
对于的一条路径,权值为 
 
=
 
所以这么做不会改变最短路。(具体也可以看这里) 
实现:第一次SPFA预处理到每个点的距离,记。然后把边权改为。 
其中为给每个点设定的权值,。 
由不等式可以得到,也就是改完之后所有边权非负。 
之后可以每个点用跑。就是啦。 
这样也可以实现跑费用流。
(后面就直接抄dls课件了QAQ) 
的偏心距  
直径  
半径  
中心 (要求定义在点上) 
绝对中心(可以定义在边上) 

相关:求最小直径生成树(差不多)。 
实现:固定一条,考虑上面的点的偏心距。 
假设第三个点是, 。 
那么对应的折线为。 
那么偏心距为条折线的最大值形成的折线。 
按左端点排序维护一下。时间复杂度
即绝对中心的最短路树。 
如何证明? 
注意一棵树的直径为半径的两倍(对绝对中心来说)。如果最小直径生成树不包含绝对中心,那么取的绝对中心,显然矛盾。
每次去掉图中入度为的点。 
时间复杂度。 
如果最后不为空集,那么这个图不为DAG。(否则每个点入度不为0,即每个点可以选择一个前趋,沿着前趋走根据抽屉原理一定能找到相同点,也就是一个环。) 
按照反图DFS,出栈序列就是一个合法的拓扑序列。 
scc缩点顺序也是一个合法拓扑序。
每个点有不同的标号,要使得拓扑序最小。 
将拓扑排序的队列改成优先队列即可。
使得最后的拓扑序中1的位置尽量靠前,如果相同比较2的位置,依次类推。 
首先考虑如何求1最早出现的位置,可以将原图反向,然后每次弹除了1之外的元素,直到队列只剩下1为止。 
这是反图中1的最晚的出现的位置,也就是原图中最早的。 
根据是否在队列里,这个图被分成两部分,在对应的图中用同样的方法处理2,依次类推。 
容易发现每次找尽量大的元素出队,能完成上述的过程。 
所以等价于反图最大字典序。
题集。
对于一个二分图,记为的一个子集,为所有中所有点的相邻点的并集。 
一个图有完备匹配当且仅当的所有子集都有。 
对一般图的推广: 
 
推论: 每个正则二分图都有完备匹配。
最小点覆盖=最大匹配 (与最大流最小割定理等价) 
最大独立集=点数-最大匹配 (独立集为点覆盖的补集) 
最小边覆盖=最大独立集 (独立集中每个点需要一条边去覆盖)
覆盖所有的边:每条边下界设为1, 然后求最小流。 
覆盖所有的点:建立二分图,对于的边,看做二分图中的,然后答案为点数-最大匹配。 
定理: 最大反链=最小链覆盖;最短的最长链=最小反链划分数-1(?存疑。见BZOJ4160)。(当然这个不应该只放在二分图部分的)
题集。
。 
将一个图的所有强联通分量缩起来会得到一个DAG。
点连通度: 最小的点集使得删去之后图不连通 
边连通度: 最小的边集使得删去之后图不连通 
如果一个图的点连通度大于1,那么是点双连通的,边连通同理。 
双联通分量为图中的极大双联通子图。
考虑DFS树,每条非树边对应着一个点到祖先的路径。对于一条非树边只要把对应的边打上标记即可。 
比如对于这条非树边,只要在点打上的标记,点打上的标记。 
到的树边的覆盖次数为子树内所有标记的和。 
割点同理(注意特判根节点和叶节点)。 
(没看懂下面要干嘛) 

题集。
一堆变量的二元限制。 
问是否存在合法的赋值。 
 

将原坐标系每个点的坐标变为,则原坐标系中的曼哈顿距离等于新坐标系中的切比雪夫距离。 
反过来,将原坐标系每个点的坐标变为,则原坐标系中的切比雪夫距离等于新坐标系中的曼哈顿距离。 
例题:BZOJ3170 松鼠聚会。