# include<iostream>
# include<algorithm>
# include<cmath>
# include<iomanip>
# include<queue>
# include<cstring>
# define endl "\n"
using namespace std;
const int maxn=100001, maxm=100001, inf=0x7fffffff;
struct Node{
int u, v, w, next;
}edge[maxm*2];
int t, n, m;
int cnt=0, head[maxn], d[maxn], inqueue_num[maxn], vis[maxn];
queue<int> q;
int add(int u, int v, int w) {
cnt++;
edge[cnt].u=u, edge[cnt].v=v, edge[cnt].w=w, edge[cnt].next=head[u];
head[u]=cnt;
}
bool spfa() {
for(int i=1; i<=n; i++) d[i]=inf;
d[1]=0; vis[1]=1; q.push(1); inqueue_num[1]++;
while(!q.empty()) {
int u=q.front(); q.pop(); vis[u]=0;
for(int i=head[u]; i; i=edge[i].next) {
int v=edge[i].v, w=edge[i].w;
if(d[v]>d[u]+w) { // 松弛
d[v]=d[u]+w;
if(!vis[v]) {
vis[v]=1; q.push(v); inqueue_num[v]++;
if(inqueue_num[v]>n) return false;
}
}
}
}
return true;
}
int main() {
cin >> t;
while(t--) {
cnt=0;
memset(head, 0, sizeof(head));
memset(d, 0, sizeof(d));
memset(inqueue_num, 0, sizeof(inqueue_num));
memset(vis, 0, sizeof(vis));
while(!q.empty()) q.pop();
cin >> n >> m;
while(m--) {
int u, v, w;
cin >> u >> v >> w;
add(u, v, w);
}
if(!spfa()) cout << "YES" << endl;
else cout << "NO" << endl;
}
return 0;
}
可以给两个关注qwq