RT,用小号交了亿遍,发现正常 SPFA 可过,但加上 SLF swap 优化就 WA 掉了
勉强可过的代码(再改就会 WA 掉)
deque<int> q;
inline void slf_swap() {
if (q.size() && d[q.front()] > d[q.back()]) swap(q.front(), q.back());
}
inline void slf_insert(int v) {
q.push_back(v);
// if (q.size() && d[v] > d[q.front()]) q.push_back(v);
// else q.push_front(v);
// slf_swap();
}
int SPFA(int st) {
memset(d, 0x3f, sizeof(d)); memset(cnt, 0, sizeof(cnt)); memset(inqueue, 0, sizeof(inqueue));
q.clear(); q.push_back(st); d[st] = 0;
while (q.size()) {
const int u = q.front(); q.pop_front();
slf_swap();
inqueue[u] = 0;
for (auto it : e[u]) {
const int v = it.first, w = it.second;
if (d[v] > d[u] + w) {
d[v] = d[u] + w;
if (!inqueue[v]) {
inqueue[v] = 1;
slf_insert(v);
if (++cnt[v] >= n) return 1;
}
}
}
}
return 0;
}