【图论】……(spfa的变形使用)
问题
就是给你一个有向图,m条边,每条边上两个权值ai,bi,让你找出一条一到n的路径,使得路径上权值a的和不超过w的情况下,权值b的值最小
样例
5 6 7
1 2 2 3
2 4 3 3
3 4 2 4
1 3 4 1
4 6 2 1
3 5 2 0
5 4 3 2
输出样例:
11
数据范围:
100%的数据 2<=N<=100 1<=K<=10000 0<=w<=1000
其他值均不超过100
分析
一般的spfa的松弛数组是一维的,而无法解决两个权值的问题,那么我们想到二维数组的方法。
q,d,v均为两维,每次松弛操作的条件为d[i,wnow+a[now,i]]>d[now,wnow]+b[now,i]
是对spfa的变形使用,至于理解,可以理解为spfa(宽搜)为二维的动态规划提供了操作的序列。
比如以前做的最短路径密度(边上的权值和除以边数最小)d[i,l+1]/l+1>d[now,l]+ll/l+1
注意所有数组都要是二维的。最初做的时候q数组和v数组写成了一维的,当然这样并不错误只是每次都需要枚举当前的体积值(下面附代码)。这样做会大大地加大程序的时间复杂度(好多循环是浪费的,由于每次枚举的a的状态不一定是被更新过的)
反思
经典算法要明白其本质,变形使用时应开阔思路。
要注意细节(代码中)