- 观光
spfa算法不存在拓扑序,这里不能使用
#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long LL;
const int N = 1e6 + 10;
int n, m, t, x, y, w, k;
int h[N], cnt = 0;
int ans[2][N], d[2][N];
struct node {
int y, w, ne;
} s[N];
void add(int x, int y, int w) {
s[++cnt].y = y;
s[cnt].w = w;
s[cnt].ne = h[x];
h[x] = cnt;
}
void dijstra(int u, int v) {
memset(d, inf, sizeof(d));
memset(ans, 0, sizeof(ans));
priority_queue<pair<int, int> > q;
q.push({0, u});
d[0][u] = 0;
ans[0][u] = 1;
while (q.size()) {
int x = q.top().second;
int z = -q.top().first;
q.pop();
if (d[0][x] == z)
k = 0;
else if (d[1][x] == z)
k = 1;
else continue;
for (int i = h[x]; i; i = s[i].ne) {
int y = s[i].y;
w = s[i].w + z;
if (d[0][y] > w) {
d[1][y] = d[0][y];
d[0][y] = w;
ans[1][y] = ans[0][y];
ans[0][y] = ans[k][x];
q.push({-w, y});
} else if (d[0][y] == w)
ans[0][y] += ans[k][x];
else if (d[1][y] > w) {
d[1][y] = w;
ans[1][y] = ans[k][x];
q.push({-w, y});
} else if (d[1][y] == w)
ans[1][y] += ans[k][x];
}
}
if (d[0][v] == d[1][v] - 1) ans[0][v] += ans[1][v];
cout << ans[0][v] << '\n';
}
int main() {
ios::sync_with_stdio(false);
cin >> t;
while (t--) {
memset(h, 0, sizeof(h));
cnt = 0;
cin >> n >> m;
while (m--) {
cin >> x >> y >> w;
add(x, y, w);
}
cin >> x >> y;
dijstra(x, y);
}
}