A HDOJ-2544
模板题。不解释了。
顺便学习了一下dij+优先队列的姿势。
【感觉代码量跟普通dij很接近啊。。。
每个点入队一次,复杂度 O(NlogN)
1 | #include <iostream> |
B POJ-1860
我放的时候以为是个大水题
其实也就是个类似判正环的。。。
(赋初值为0的话就保证了每次操作不出现负数)
主要是没想到 Bellman-Ford 然后其他的又写不太清楚。。。
后来查了一下还是写 Bellman-Ford 比较简洁:O(NM)
1 | #include <iostream> |
C HDOJ-4514
我竟然会有一天因为读入忘记加 !=EOF TLE七次
看了看网上的题解 基本都是并查集+DP。
其实没有必要。。。
无向图判环最基本的方法就是DFS。。。
其次 不成环的话就是森林
每棵树用两次BFS求直径的方法
也就是说这题是DFS+BFS。。。
这样就完全不会有空间的问题
不过我也不知道出题人的本意是哪个。。。
判环时每个点遍历一次,求长度时每个点遍历两次,复杂度 O(N)
1 | #include <iostream> |
D HDOJ-2196
【准确的说跟上一题知识点有重叠。。。
很明显题目里给的是一棵树
可以证明,到 u 最远距离的 v 一定是直径的一端。
假设有 v’ 使得 u-v’ 距离更长,
1、u 在直径上:记直径另一端为 s ,显然有 s->u->v’ 比 s->u->v 长,这与 v 为直径一端矛盾。
2、u 不在直径上:记直径另一端为 s ,
以 u 为根,v’ 不能在 u->s 和 u->v 上。
则 (u->v’) + (u->s) 大于 (u->v) + (u->s) 大于等于 (v->s) ,矛盾。
于是只需要求直径两端到各个点的距离。
每个点被遍历三次,复杂度 O(N)
1 | #include <iostream> |
E HDOJ-4885
题意就是平面上有好多加油站
一个人要从学校回家
这个人有一辆满油的摩托车
跑到 L 距离时会用完油
在加油站加油每次都要加满
而且每次加油之前走的都是直线
模型也不难。
就是距离小于等于 L 的可以连边,然后丢进第一题的模板里跑。
唯一蛋疼的就是必须走“直线”,也就是可能被强迫加油。。。
于是我就不会了。。。但是听说 N^3 能过。。。
然后我试了几种:
1、加边的时候数一下到底穿过几个点。。。
2、n-1 个点里面同向的点只加最近的。
3、先保存一下距离满足条件的,再在这里面同向只加最近的。
1 过不了。。。2 估计我写挂了。。。3 62MS。。。
最差情况复杂度 O(N^3)
1 | #include <iostream> |