Description
Input
Output
Sample Input
3 3
1 2 10
1 3 -5
3 3 -15
5 3
1 5 100
3 5 50
1 2 51
Sample Output
false


#include<cstdio> #include<cctype> #include<queue> #include<cmath> #include<cstring> #include<algorithm> #define rep(i,s,t) for(int i=s;i<=t;i++) #define dwn(i,s,t) for(int i=s;i>=t;i--) #define ren for(int i=first[x];i;i=next[i]) using namespace std; const int BufferSize=1<<16; char buffer[BufferSize],*head,*tail; inline char Getchar() {if(head==tail) {int l=fread(buffer,1,BufferSize,stdin);tail=(head=buffer)+l;}return *head++; } inline int read() {int x=0,f=1;char c=Getchar();for(;!isdigit(c);c=Getchar()) if(c=='-') f=-1;for(;isdigit(c);c=Getchar()) x=x*10+c-'0';return x*f; } const int maxn=110; const int maxm=2010; int n,m,first[maxn],next[maxm],to[maxm],dis[maxm],e; void AddEdge(int u,int v,int w) {to[++e]=v;dis[e]=w;next[e]=first[u];first[u]=e; } int vis[maxn],d[maxn]; int dfs(int x) {vis[x]=1;ren if(!vis[to[i]]) {d[to[i]]=d[x]+dis[i];if(!dfs(to[i])) return 0;}else if(d[to[i]]!=d[x]+dis[i]) return 0;return 1; } int main() {dwn(i,read(),1) {e=0;n=read()+1;m=read();memset(first,0,sizeof(first));while(m--) {int s=read(),t=read()+1,w=read();AddEdge(s,t,w);AddEdge(t,s,-w);}memset(vis,0,sizeof(vis));int ok=1;rep(i,1,n) if(!vis[i]) if(!dfs(i)) {ok=0;break;}puts(ok?"true":"false");}return 0; }