您的位置:首页 > 理论基础 > 计算机网络

12.15 省选训练总结

2017-12-17 18:47 295 查看

目录

完成情况题目出处
GGS-DDUHDU 4966
JourneyCDOJ 92
NetworkPOJ 1144
朋友圈BZOJ 2744 [HEOI 2012]
放箱子CDOJ 1432
Harry Potter and the Forbidden ForestHDU 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.跑完一次最短路之后,枚举一条边的两个端点就可以啦。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  网络 总结