目录
完成情况 | 题目 | 出处 |
---|---|---|
GGS-DDU | HDU 4966 | |
Journey | CDOJ 92 | |
Network | POJ 1144 | |
朋友圈 | BZOJ 2744 [HEOI 2012] | |
放箱子 | CDOJ 1432 | |
Harry Potter and the Forbidden Forest | HDU 3987 | |
度度熊的交易计划 | HDU 6118 |
最小树形图
定义:
在一个有向图中,钦定一个根节点,然后选取一些边,然后使得根节点可以达到任意一个节点,就是广义的最小生成树。算法:朱刘算法
首先判断图的连通性,如果不连通,就肯定没解。
如果有,为每一个点选取一个权值最小的入边,暂时当做选择它。
选完之后可能有环,我们缩一下环,然后对于一个环,每当有一个环上连一条边的时候,将环上的一个点拆了,然后把边连上去,这样子,可以保证必定变成一个树。
例题
- Hdu 4966
先把课的等级离散一下,然后每一个点向等级低的点来连一条0的边,这样子表示如果学会这个等级,那么小的等级也会学会,然后把a向b按照题意连一条边,这样搞树形图就可以啦。
TARJAN
tarjan
算法的核心是
dfn
与
low
数组,一个是表示访问到某一个节点的时间戳,一个是这个点能访问的点的最小的时间戳,这样子,如果有环的话,那么就可以直接更新了。但是我们要注意一些细节,比如判断这个点有没有被访问过是用他的
dfn
来算,而不是
vis
数组。
vis
的意义是访问过的,并且这个时候还在栈中的点。还有就是如果用
stl
的栈,不要忘了最后弹一下当前点。
借此算法,我们可以求
SCC
,无向图的割点和割边(桥),那么以割点为例,割点的判断是他的后代没有能指向他的父亲的边,这个也明显可以用
low
这些来算。这样子,桥的话类似,就是看连接的两个点。
LCA
方法有很多, 倍增 , RMQ , tarjan 等等都可以,具体的略去。
例题
- Cdoj 92
这种迂腐的题,当然可以直接在仙人掌上跑最短路,但是不用这么麻烦,因为我们可以这样:新的最短路要么是原路,要么是走到新的边上的路径,我们可以直接算出这几个点的距离,比较一下就好了。
无向图求割顶
原理
(见之前)使用 tarjan ,如果有这个点能到的点的 low 小于其 dfn ,说明他不是割顶,反之,如果不小于,那么就是一个割顶。
例题
Poj 1144
裸题……
次长路
定义:
大于最短路的最小路径。
方法有两种:
1.
dijkstral
的时候再纪录一下次长路的长度,此时次长路转移什么的就可以直接枚举某一条边转移,这样子还可以顺便记录下条数。
2.跑完一次最短路之后,枚举一条边的两个端点就可以啦。