12.15 省选训练总结

来源:互联网 发布:ubuntu vmdk 下载 编辑:程序博客网 时间:2024/05/18 12:32

目录

完成情况 题目 出处 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算法的核心是dfnlow数组,一个是表示访问到某一个节点的时间戳,一个是这个点能访问的点的最小的时间戳,这样子,如果有环的话,那么就可以直接更新了。但是我们要注意一些细节,比如判断这个点有没有被访问过是用他的dfn来算,而不是vis数组。vis的意义是访问过的,并且这个时候还在栈中的点。还有就是如果用stl的栈,不要忘了最后弹一下当前点。
借此算法,我们可以求SCC,无向图的割点和割边(桥),那么以割点为例,割点的判断是他的后代没有能指向他的父亲的边,这个也明显可以用low这些来算。这样子,桥的话类似,就是看连接的两个点。

LCA

方法有很多,RMQtarjan等等都可以,具体的略去。

例题

  • Cdoj 92
    这种迂腐的题,当然可以直接在仙人掌上跑最短路,但是不用这么麻烦,因为我们可以这样:新的最短路要么是原路,要么是走到新的边上的路径,我们可以直接算出这几个点的距离,比较一下就好了。

无向图求割顶

原理

(见之前)使用tarjan,如果有这个点能到的点的low小于其dfn,说明他不是割顶,反之,如果不小于,那么就是一个割顶。

例题

Poj 1144
裸题……

次长路

定义:

大于最短路的最小路径。

方法有两种:

1.dijkstral的时候再纪录一下次长路的长度,此时次长路转移什么的就可以直接枚举某一条边转移,这样子还可以顺便记录下条数。
2.跑完一次最短路之后,枚举一条边的两个端点就可以啦。

原创粉丝点击