总的感受:
这里大概囊括了一下图论的基础知识,图论是一个比较考验思维的部分。
尤其是后面有关二分图,网络流等的分支,对建模转化的要求还是很高的。
进入正题了:
一、最短路:
这一个部分不想多讲,虽然是很基础的一个部分,但是也很重要。
题目:
1、Telephone Lines。p.s:二分答案+最短路。
2、Roads and Planes。p.s:Topo序+dijkstra。
3、Cow Relays。p.s:Floyd+矩阵乘法。
二、最小生成树:
基础算法的话也不多讲了。主要是其实有些这种类型的题也很考验思维。。。
题目:
1、picnic planning。 p.s:最小生成树+枚举。
三、树的直径与LCA:
树的直径求法: ① 树形DP。 ②两遍BFS/DFS。
LCA的求法: ①树上倍增。 ②Tarjan+并查集(离线)。
这一类型的题目,一般需要能够发现隐藏在题目中的一些优秀的性质,然后和这些东西挂上联系,然后就很舒服了(有前提的略略略)。
题目:
1、APIO2010巡逻 p.s:分类讨论+树的直径。 题解传送门
2、NOIP2007树网的核 p.s:分析性质+树的直径。 题解传送门
3、POJ3417Network p.s:问题转化+树上差分。 题解传送门
4、SDOI2015寻宝游戏 p.s:dfs序+set(虚树??!!)题解传送门
5、严格次小生成树 p.s:最小生成树+树上倍增。题解传送门
6、NOIP2012疫情控制 p.s:二分答案+贪心+树上倍增。题解传送门
四、基环树
一般用来作为树问题的扩展。。解决基环树问题常用思路:一般先考虑树,然后挂上一条边后产生的影响(和没说一样)。。。
1、IOI2008Island p.s:基环树直径。题解传送门
五、负环与差分约束系统
负环的判定spfa不多聊。
讲下差分约束系统:
这是一种特殊的N元不等式组,它的N个变量a1...aN,满足一些形如下的约束:
ai-aj<=bk
ai==aj
ai-aj>=bk
...
然后需要解决的问题就是求一组解使得上述约束全部满足。
可以发现上述的式子和最短路需要满足的三角形不等式:dis[y]<=dis[x]+ver(x,y)十分相似。
那么我们可以考虑到把这些约束看作是两两变量之间的边,相对应的跑最短(长)路即可。
具体一点,
对于形如:ai-aj<=ck的式子,我们可以转换成ai<=aj+ck。
那么就相当于向j往i连了一条长为ck的边,那么对应的跑最短路即可。特殊的:如果存在负环无解
而对于形如:ai-aj>=ck的式子,就转换成ai>=aj+ck,可以发现只需将最短路改成最长路即可。
题目:
咕咕咕。。。
六、Tarjan与图的连通性
无向图桥(割边)判定:
low[y]>dfn[x];
无向图割点判定:
low[y]>=dfn[x];
//需要注意的是需要判断根节点的特殊情况...
无向图边双连通分量(e-DCC)求法:
把所有的桥去掉后得到的所有的连通块都是一个e-DCC。
无向图点双连通分量(v-DCC)求法:
把所有的割点去掉后得到的所有的连通块都是一个v-DCC???。
并不是。。。一定不能乱来啊233
事实上可以发现一个割点可能出现在多个v-DCC中。
这个时候就按照割点判断法则来,把用一个栈维护起来的点一个个弹出,他们组成一个v-DCC。
同时,需要把割点的标记清空,因为后续它还有可能出现在别的v-DCC中。
e-DCC的缩点比较常规,需要注意的是v-DCC的缩点,新的图应该包括了每一个v-DCC和每一个割点。
有向图强连通分量(SCC)的求法:对于每一个点,若存在:
low[x]==dfn[x];
那么把栈中维护的元素弹到x为止。
SCC的缩点也比较常规。
有向图的必经点和必经边。
注意:此处不考虑有环的情况。对于有环的情况请自行了解支配树。
既然没有环,可以直接正反两次进行Topo排序。
记录到x路径条数,不妨设从S到x路径条数为f[x],从x到T路径条数为t[x]。
① 如果对于一条有向边(x,y)。如果满足:
f[x]*t[y]==f[T];
则此边为必经边。
② 如果对一个点x。如果满足:
f[x]*t[x]==f[T];
则此点为必经点。
题目:
1、POI2008BLO p.s:割点。题解传送门
2、Knights of the Round Table p.s:点双连通分量+奇环。题解传送门
七、2-SAT问题
对于N个变量,每个变量只有两种取值。然后有M个条件,每个条件是关于两个变量取值的限制。
问能否找到一组合法的赋值方案使得M个条件都满足。
判定是否合法的方法:
首先,对这N个点建一张2N个点的图,i和i+N对应的点i的两个取值。
然后,根据每一个条件连有向边,(一般需要转一下思维)。
最后,tarjan缩强连通分量,如果任意一个SCC内存在i,i+N,那么就不合法。否则合法。
求一组合法赋值方案的方法:
这是个人理解:由于选择一个零出度点,不会对其他点造成影响。
所以:
1、我们可以建反图Topo序,相当于在原图自底向上进行Topo。
每遇到一个没有确定赋值的点,就给它和它对应的点赋值。
2、由于我们发现tarjan缩点得到的每一个SCC的顺序正好是自底向上的,所以我们可以直接赋值。
val[i]=c[i]>c[opp[i]];
//c是强连通分量编号...
//i代表xi,0,opp[i]代表xi,1...
八、二分图和网络流
定义:一张没有奇环的无向图是二分图。
二分图判定方法:dfs染色。若存在相邻两个点,他们的颜色相同,那么就存在奇环。
最大匹配求法:① 匈牙利算法 ② 网络流。
完备匹配:一张图具有完备匹配,当且仅当两边的点都为N个,且最大匹配为N。
多重匹配:在最大匹配的基础上,点可以连不超过一特定限制数量的另一侧的点。
最大带权匹配:边有边权,在最大匹配的前提下,使权值和最大。
最大带权匹配求法:① KM算法 ② 费用流。
需要注意的是:KM算法仅仅适用于二分图具有完备匹配,所以一般都是费用流。
二分图最小点覆盖:等于最大匹配数。
简略证明一下:
首先,由于每条匹配边都肯定需要至少取一个端点,所以不可能小于最大匹配数。
因此只需要给出一组构造,使得点数等于最大匹配数即可。
构造如下:
首先,先求出二分图最大匹配。
然后,对于每一个左部非匹配点在进行一次寻找增广路的过程,(必然失败),同时进行访问标记。
最后,选出左部未访问的节点和右部访问了的节点,这些点构成一组点数为最大匹配数的最小点覆盖。
原因:
左部的非匹配点显然都被标记了,右部的非匹配点肯定没被标记,一对匹配点要么同时被标记要么同时没被标记。
那么:
1、匹配边都被覆盖了,因为恰好每条匹配边只取了一个点。
2、两个端点都是非匹配点的情况不存在,与最大匹配矛盾。
3、左部是非匹配点,右侧是匹配点的非匹配边被覆盖了。
4、右部是非匹配点,左侧是匹配点的非匹配边,左部点一定没被访问,所以也被覆盖了。
证毕。
二分图最大独立集:等于总点数-最小覆盖,即也等于总点数-最大匹配。
证略。
最大流:EK算法,dinic算法(当前弧优化)。
最小割:最小割等于最大流。
费用流:spfa-EK费用流。
题目:
最后的最后
蒟蒻的图论部分就到此结束了,有些地方讲的有点含糊不清,请多包容。
上述题解会很快跟上的。。。(希望别咕掉了@ο@)