优先队列版本
void spfa() {
priority_queue<pii, vector<pii>, greater<pii> > heap;
heap.push({0, 1}); vis[1] = 1;
while(heap.size()) {
ll t = heap.top().second; heap.pop(); vis[t] = 0;
for(int i = h[t]; i != -1; i = edges[i].next) {
int j = edges[i].e;
if(dist[j] > dist[t] + edges[i].w) {
dist[j] = dist[t] + edges[i].w;
cnt[j] = cnt[t] + 1;
if(cnt[j] >= n) {
cout << "YES\n";
return ;
}
if(vis[j] == 0) {
vis[j] = 1;
heap.push({dist[j], j});
}
}
}
}
cout << "NO\n";
return ;
}