权值线段树:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn = 100007;
int f[maxn],d[maxn];
int n,m,l,r,v;
int find(int x)
{
if(x==f[x])return x;
int now = f[x];
f[x]=find(f[x]);
d[x]=d[x]+d[now];
return f[x];
}
int main()
{
scanf("%d %d",&n,&m);
int ok = 1;
for(int i=1;i<=n;i++)f[i]=i;
for(int i=1;i<=m;i++)
{
scanf("%d %d %d",&l,&r,&v);
int fl = find(l);
int fr = find(r);
if(fl==fr)
{
if(d[l]-d[r]!=v)ok = 0;
}
else
{
f[fl]=fr;
d[fl]=v+d[r]-d[l];
}
}
if(ok)cout<<"Yes"<<endl;
else cout<<"No"<<endl;
return 0;
}