题面:
刁姹接到⼀个任务,为税务部⻔调查⼀位商⼈的账本,看看账本是不是伪造的。账本上记录了
n
个⽉以来的收⼊情况,其中第
每个测试点内有
T<100
组数据,每组都满足
n<100,m<1000
.
题解:
带权并查集,在合并的时候维护一下权值就可以了。
/*
ID:Agreement
LANG:C++
*/
// Invincible
#include <bits/stdc++.h>
#define rep( i , l , r ) for( int i = (l) ; i <= (r) ; ++i )
#define per( i , r , l ) for( int i = (r) ; i >= (l) ; --i )
#define erep( i , u ) for( int i = head[(u)] ; ~i ; i = e[i].nxt )
using namespace std;
const int maxn = 100 + 5;
int f[maxn] , v[maxn] , flg;
int Find( int x ){
if( x == f[x] ) return x;
int t = Find( f[x] );
v[x] += v[f[x]];
return f[x] = t;
}
void ins( int x , int y , int w ){
int fx = Find( x ) , fy = Find( y );
if( fx != fy ){
f[fx] = fy;
v[fx] = v[y] - v[x] - w;
}else if( v[y] - v[x] != w ) flg = 1;
}
int main(){
int T = 0 , N = 0 , M = 0 , x , y , w ;
scanf("%d" , &T);
while( T-- ){
flg = 0;
scanf("%d %d" , &N , &M);
memset( v , 0 , sizeof v );
rep( i , 0 , N ) f[i] = i;
rep( i , 1 , M ){
scanf("%d %d %d" , &x , &y , &w);
ins( x - 1 , y , w );
}
if( flg ) puts("false");
else puts("true");
}
return 0;
}