code:
#include <bits/stdc++.h>
using namespace std;
void read(int &x) {
int s=0,w=1;
char c=getchar();
while(c<'0'||c>'9') {
if(c=='-') {
w=-1;
}
c=getchar();
}
while(c>='0'&&c<='9') {
s=s*10+c-'0';
c=getchar();
}
x=s*w;
return;
}
int w;
int n,m;
struct edge {
int next,to,wt;
} e[2010];
int head[2010],tot;
int dist[110],cnt[110];
bool vis[110];
inline void add(int u,int v,int w) {
tot++;
e[tot].to=v;
e[tot].next=head[u];
head[u]=tot;
return ;
}
inline bool SPFA(int s) {
queue<int> q;
dist[s] = 0;
vis[s] = 1;
q.push(s);
while (q.size() > 0) {
int x = q.front();
vis[x] = 0;
q.pop();
for (int i = head[x]; i; i = e[i].next) {
int y = e[i].to;
if (dist[x] + e[i].wt < dist[y]) {
dist[y] = dist[x] + e[i].wt;
cnt[y] = cnt[x] + 1;
if (cnt[y] > n) {
return true;
}
if (!vis[y]) {
vis[y] = 1;
q.push(y);
}
}
}
}
return false;
}
int s,t,v;
int main() {
read(w);
for(int test=1; test<=w; test++) {
memset(e,0,sizeof(e));
memset(head,0,sizeof(head));
memset(dist,0x3f3f3f3f,sizeof(dist));
memset(vis,0,sizeof(vis));
read(n);
read(m);
for(int i=1; i<=m; i++) {
read(s);
read(t);
read(v);
add(s-1,t,w);
add(t,s-1,-w);
}
for(int i=1; i<=n; i++) {
add(n+1,i,0);
}
if(SPFA(n+1)) {
printf("true\n");
} else {
printf("false\n");
}
}
return 0;
}
必回关