【图论】……(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的状态不一定是被更新过的)

反思

经典算法要明白其本质,变形使用时应开阔思路。

要注意细节(代码中)

posted @ 2011-06-13 17:51  liukee  阅读(364)  评论(1编辑  收藏  举报