题意:
解法:
显然就是判断若干等式是否有解,可以用差分约束做.
但这题也可以dfs做,
建图:
点l对点r建一条边权为d的边.
点r对点l建一条边权为-d的边.
对为访问过的点dfs,一遍dfs一遍按照边权赋值,
如果出现冲突则无解.
code:
#include <bits/stdc++.h>
#define int long long
#define PI pair<int,int>
using namespace std;
const int maxm=1e6+5;
const int mod=1e9+7;
vector<PI>g[maxm];
int dist[maxm];
int mark[maxm];
int n,m;
int ok=1;
void dfs(int x){
if(!ok)return ;
mark[x]=1;
for(auto i:g[x]){
int v=i.first,w=i.second;
if(!mark[v]){
dist[v]=dist[x]+w;
dfs(v);
}else{
if(dist[v]!=dist[x]+w){
ok=0;
}
}
}
}
void solve(){
cin>>n>>m;
for(int i=1;i<=m;i++){
int l,r,d;cin>>l>>r>>d;
g[l].push_back({r,d});
g[r].push_back({l,-d});
}
for(int i=1;i<=n&&ok;i++){
if(!mark[i]){
dfs(i);
}
}
if(ok)cout<<"Yes";
else cout<<"No";
}
signed main(){
ios::sync_with_stdio(0);cin.tie(0);
solve();
return 0;
}