[POJ 3159]

Candies

差分约束系统。

偶尔发现的很好的题目,对最短路径算法的优化要求较高。

敲了一个SPFA+SLF。其中双端循环队列是手写的,int读入用了getchar处理以节省时间,作了去重边处理。但即使这样也才250ms(g++)。

之后又考虑了用dijkstra。没有优化过直接交果然TLE了。然后开始考虑改进。直接用最小堆来实现最优的dijkstra不太好写,而折中地每次将可能更新最短路径值的点全部push进优先队列的做法是相对比较好实现的,也不会耗损太多时间。第一次写这样的dijkstra,调试了挺久。最后在g++下235ms,c++下1297ms。

吐个小槽……priority_queue里面自定义仿函数时,若比较用的是<,建出来的竟然是大根堆……直觉上怎样也觉得<对应的应该是最小元素在上的小根堆才对……>__< 后记:第二天过来后被Usozki教育了下,他的代码仅仅是SPFA+栈,没有太多优化……但是直接跑出79ms进入第一版了…… 附POJ 3159 by Usozki: