bzoj1202

时间:2023-03-09 23:22:09
bzoj1202

很久以前写的,忘补解题报告了
首先似乎dfs就可以了吧?
但还有更高大上的做法
其实这东西就是告诉sum[y]-sum[x-1]=z
然后给出一堆看成不成立
可以用并查集,维护每个点到father点的差即可

 var sum,fa:array[..] of longint;
i,t,n,m,x,y,z,k1,k2:longint;
ch:boolean;
function getf(x:longint):longint;
var k:longint;
begin
if fa[x]=x then exit(x)
else begin
k:=fa[x];
fa[x]:=getf(fa[x]);
sum[x]:=sum[x]+sum[k];
exit(fa[x]);
end;
end; begin
readln(t);
while t> do
begin
readln(n,m);
for i:= to n do
fa[i]:=i;
ch:=true;
fillchar(sum,sizeof(sum),);
for i:= to m do
begin
readln(x,y,z);
if not ch then continue;
dec(x);
k1:=getf(x);
k2:=getf(y);
if (k1<>k2) then
begin
fa[k1]:=k2;
sum[k1]:=sum[y]-sum[x]+z;
end
else if sum[x]-sum[y]<>z then
begin
ch:=false;
break;
end;
end;
if ch then writeln('true') else writeln('false');
dec(t);
end;
end.