算法分析
乍一看以为是网络流,差点弃题,因为网络流还没看。。。但是显然这不是一道网络流,题目描述很明显,单源双向边最短路径问题,这道题关键在于边权的处理方面,所以先手算一下样例。开始的时候自己手算样例算半天一直不对,后来才看到下面还有一个说明提示(所以以后一定要多看说明提示里面的内容)
说明提示:
FJ wants to send 15 units of milk through his pipe network. Pipe #1 connects junction point 1 (the barn) to junction point 2, and has a latency of 10 and a capacity of 3. Pipes #2 and #3 are similarly defined.
The path 1->3 takes 14 + 15/1 = 29 units of time. The path 1->2->3 takes 20 + 15/2 = 27.5 units of time, and is therefore optimal.
约翰想要通过管网运送15个单位的牛奶。管道1连接节点1(谷仓)和节点2,延迟为10,容量为3。管道2和管道3也以相似的方式来定义。
路径1->3花费14+15/1=29个单位的时间。路径1->2->3花费20+15/2=27.5个单位的时间,用时最少。
算法分析:
起初的想法:可以把两个点之间的“距离”L+X/C分成两个部分来算第一部分是L,第二部分是X/C,可以先用单源最短路径的求法,在L+X/C中,针对从起点到终点的各个道路,算出该道路的“最窄部分”,然后苦思冥想,甚至结合了贪心的思路,最后都无法实现。因为每种路线的最窄部分都可能不一样,如果要打标记的话,不知道应该打在哪里。
更正后的思路:于是翻阅题解,然后幡然醒悟。原来可以从小到大枚举最多m种可能的容量,然后在每个容量的制约下再算最短路即可。(其实自己和最开始想的分成两部分有些相似之处,但是仔细一想是自己思考不足,自己的分成两部分的结果是第一部分可算,第二部分不可算。而改成枚举之后,就使得两部分都可以算了,因为在各个枚举情况下X/C的值是固定的)。
获得的启发:解题时遇到看起来很难算的,比如本题中的L+X/C,分成两个或者多个部分来算,再通过枚举等方式让各个部分都好算或者是在各个枚举情况下,其中一个部分好算,另外的部分固定。