前言
决赛的过程颇为坎坷,深深的感受到了自身能力的不足,团队的力量有时要远胜个人。
开源地址:https://github.com/Chadriy/CodeCraft2020
放题
复赛结束,还没来得及感慨,第二天一大早就放题了。实在是不想做题目介绍了,简单说明一下,仍然是给定一个有向加权图,不过解题目标变更为计算网络中节点介数中间性,并返回top100的点与其精确值,对于概念及算法可以参考https://blog.csdn.net/betarun/article/details/51168259。基本上,大家参考的都是2001年brandes在论文《A faster algorithm for betweenness centrality》中提出的算法,一天之内算法就内卷了呢(无奈摊手.jpg)。
然后队友一天写好了base,然后造了份数据集(tql),之后几天就是debug和精度问题。
练习榜A
决赛后我们进入了分别solo的状态,蔡总写好base后被导师gank出差去了,于是交给我继续搞这base。第一版的最短路算法我们用的是优先队列的dijskra算法,配合brandes算法计算介数中间性。由于算法复杂度提高了非常多,之前对io的优化基本上没有作用了。因此优化思路被限制成三种:
- 算法逻辑的优化
- 数据结构优化
- 针对数据集优化
线上开放测试,我们很快意识到针对底层的优化经过初赛复赛已经达到了瓶颈,因此一开始没有很好的方案。榜A第一天,官方公布了数据集的规模,并给了一个线上线下特性同步的数据集,根据其大小我们推测,完全随机图是根本跑不完的。之后测测数据集特性,主要是度特性、权值分布、scc这些,发现平均度为1。继续观测数据集,发现总点数约80w,而其中60w+为入度0出度1点,形状有些像刺猬。
于是根据公示的等价性,入度0点的 σ \sigma σ为其邻接表的 ∑ l r σ \sum\limits_{l~r}\sigma