最短路 拓扑排序
对于每个点跑一遍最短路(Dij很稳,spfa也可以)。一条边在最短路上当 d [ x ] + d = d [ v ] d[x]+d=d[v] d[x]+d=d[v]。我们对跑出来的图进行拓扑排序,正着做一遍求出从起点到达点 i i i的最短路方案 s 1 [ i ] s1[i] s1[i],倒着做一遍求出以点 i i i为起点的最短路方案 s 2 [ i ] s2[i] s2[i]。一条边在这张图里的贡献就是 s 1 [ x ] ∗ s 2 [ v ] s1[x]*s2[v] s1[x]∗s2[v]。
代码:
#include<queue>
#include<cctype>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 1505
#define M 5005
#define F inline
using namespace std;
const long long p=1e9+7;
struct edge{
int nxt