首先思考一个暴力做法,枚举左端点,然后对右端点进行 dp,记录从左端点到 \(i\) 的路径条数 \(f_i\),最短路径长度为 \(dis_i\)。答案即为所有满足 \(f_i=2\) 的 \(i\) 的个数。
发现 \(f_i>3\) 的时候再多记录 \(f_i\) 的具体值是没有意义的,所以 \(f_i\) 大于 \(3\) 时将状态合并即可。
然后考虑怎么算答案,发现一个性质:如果长度最短的路径恰好有两条,那么这两条路径只有一个位置不同。可以看做两个路径在前 \(l\) 层相同,在 \(l+1\) 层不同,在 \(l+1\) 层以后又相同。
所以只需要记录对于每个相同的层,最后三个位置的 \(f\) 值。
如果一个位置不同,下一个位置相同,那么后边转移的位置只要相同,都可以作为答案。这个过程可以进行 dp,每层的答案直接用区间长度累加答案即可。