RT 下面是代码,里面有一行: while(!q.empty()) q.pop();//注意这里!!!!! 这一行写不写交到洛谷上都AC了,但是我在做一道站外的相同题的时候只有删掉这句话才可以AC,请问这句代码到底应不应该写呢?qwq
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e3 + 5;
const int maxm = 6e3 + 10;
int head[maxm], vis[maxn];
long long dis[maxn];
int cntn[maxn];
int cnt;
int n, m, T;
queue<int> q;
struct edge {
int to, nxt, w;
} a[maxm];
void add(int x, int y, int w) {
a[++cnt].nxt = head[x];
head[x] = cnt;
a[cnt].to = y;
a[cnt].w = w;
}
bool SPFA() {
memset(dis, 0x7f, sizeof(dis));
memset(vis, 0, sizeof(vis));
// while(!q.empty()) q.pop();//注意这里!!!!!
memset(cntn, 0, sizeof(cntn));
q.push(1);
dis[1] = 0;
vis[1] = 1;
// cntn[1]=1;
while (!q.empty()) {
int u = q.front();
q.pop();
vis[u] = 0;
for (int i = head[u]; i; i = a[i].nxt) {
int v = a[i].to;
if (dis[v] > dis[u] + a[i].w) {
dis[v] = dis[u] + a[i].w;
cntn[v] = max(cntn[v], cntn[u] + 1);
cntn[v] = cntn[u] + 1;
if (cntn[v] > m)
return true;
if (!vis[v]) {
q.push(v);
vis[v] = 1;
}
}
}
}
return false;
}
int main() {
scanf("%d", &T);
for (int k = 1; k <= T; k++) {
cnt = 0; //!!!
for (int i = 1; i < maxm; i++) head[i] = 0;
scanf("%d%d", &n, &m);
int x, y, w;
for (int i = 1; i <= m; i++) {
scanf("%d%d%d", &x, &y, &w);
add(x, y, w);
if (w >= 0)
add(y, x, w);
}
if (SPFA())
printf("YE5\n");
else
printf("N0\n");
}
return 0;
}