【NOIP2017 D1T3】逛公园

NOIP2017 D1T3 逛公园

题意:给一个有向图,每条边有权值,问从\(1\)\(N\)的长度不超过最短路长度\(+K\)的路径条数。如果有无数条则输出\(-1\)

思路:我们首先扔掉\(-1\)的情况,再扔掉\(K>0\)的情况,来考虑最裸的最短路计数。那么我们就可以考虑\(dp(i)\)表示走到\(i\)号节点有多少种路径。那么一个记忆化搜索就可以完成这个操作辣。这玩意能得\(30pts\)

然后考虑\(K>0\)的情况。那么\(dp\)的维度就不能只是\(1\)维了,需要加上一维\(dp(i,j)\)表示到了\(i\)节点,距离为\(dis_i+j\)的路径条数。然后转移的时候枚举\(v\rightarrow i\),从\(dp(v,dis_i+j-cost_{v,i}-dis_v)\)转移来、用记忆化搜索即可。这玩意能得\(70pts\)

最后我们考虑有\(-1\)的情况,样例告诉我们:有\(-1\)必定有\(0\)环,但有\(0\)环不一定有\(-1\)。所以我们来找找如何在记忆化搜索中找到\(0\)环。

特别特别难发现:如果我们现在有一个正在查询的状态\(dp(i,j)\),而我们现在又看到了我们需要查询\(dp(i,j)\),那么我们肯定这边有一个权值和为\(0\)的环。

证明:

我们证如果没有权值和为\(0\)的环,那么不会出现上述情况。

首先如果根本就没有环,那么肯定没有任何问题,根本就不会回到\(i\)这个点。

如果有权值和非\(0\)的环,那么转了一圈会回到\(dp(i,j')(j'<j)\),因为每次我们加上\(dis_i\)减去\(dis_v\)的过程经过一个环全消掉了,不会对\(j\)产生影响;而每次\(+j-cost\),会给\(j\)减去\(\sum cost\),所以\(j\)只会变小。

证毕。

所以这样就可以\(ac\)辣。

猜你喜欢

转载自www.cnblogs.com/denverjin/p/10503648.html