写了个普通的spfa判负环对了,结果优化判断的条件的时候错了:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
typedef long long ll;
typedef double lf;
using namespace std;
const int INF = 1e9+7;
const int maxn = 2e3+5;
const int maxm = 3e3+5;
int T, n, m;
int dis[maxn], cnt[maxn], inD[maxn];
bool inq[maxn], check;
struct node{
int v, w;
int next;
}edge[maxm*2];
int head[maxn];
int cntE = 0;
void addedge(int u, int v, int w){
edge[++cntE].v = v;
edge[cntE].w = w;
edge[cntE].next = head[u];
head[u] = cntE;
}
void setup(){
memset(dis, 0x3f, sizeof(dis));
memset(inq, 0, sizeof(inq));
memset(cnt, 0, sizeof(cnt));
memset(edge, 0, sizeof(edge));
memset(head, 0, sizeof(head));
memset(inD, 0, sizeof(inD));
n = 0; m = 0; cntE = 0;
check = false;
}
void spfa(int s){
queue<int> q;
dis[s] = 0;
q.push(s);
inq[s] = 1;
cnt[1]++;
while (!q.empty()){
int u = q.front();
q.pop();
inq[u] = 0;
for (int i = head[u]; i; i = edge[i].next){
int v = edge[i].v;
int w = edge[i].w;
if (dis[v] > dis[u]+w){
dis[v] = dis[u]+w;
if (inq[v] == 0){
q.push(v);
inq[v] = 1;
cnt[v]++;
}
//改成cnt[v] > n就AC了
if (cnt[v] > inD[v]){
check = true;
return;
}
}
}
}
}
int main(){
scanf("%d", &T);
int s = 1;
while (T--){
setup();
scanf("%d %d", &n, &m);
for (int i = 1; i <= m; i++){
int u, v, w;
scanf("%d %d %d", &u, &v, &w);
if (w >= 0){
addedge(u, v, w);
addedge(v, u, w);
inD[u]++; inD[v]++;
}else{
addedge(u, v, w);
inD[v]++;
}
}
spfa(s);
if (check){
printf("YES\n");
}else{
printf("NO\n");
}
}
return 0;
}
有没有大佬救命qwq