#include<bits/stdc++.h>
using namespace std;
using ll = long long;
using PII = pair<int,int>;
const int N = 2e5 + 10;
const ll INF = 1e9 + 7;
int n,m;
ll dist[N];
int cnt[N];
vector<PII>G[N];
bool enter[N];
bool spfa(int start)
{
queue<int>q;
dist[start] = 0;
cnt[start] ++;
enter[start] = 1;
q.push(start);
while(!q.empty())
{
int u = q.front();
q.pop();
enter[u] = 0;
for(auto [v,dis]:G[u])
{
if(dist[v] > dist[u] + dis)
{
dist[v] = dist[u] + dis;
q.push(v);
cnt[v] ++;
enter[v] = 1;
if(cnt[v] >= n)return 0;
}
}
}
return 1;
}
int main()
{
fill(dist,dist + N,INF);
cin >>n >>m;
for(int i = 1;i <= m;i ++)
{
int op,a,b,c;
cin >>op >>a >>b;
if(op == 1)
{
cin >> c;
G[a].push_back({b,-c});
}else if(op == 2)
{
cin >> c;
G[b].push_back({a,c});
}else{
G[a].push_back({b,0});
G[b].push_back({a,0});
}
}
bool neg = true;
for(int i = 1;i <= n;i ++)
{
if(dist[i] == INF)
{
neg = spfa(i);
if(neg == 0)break;
}
}
// for(int i = 1;i <= n;i ++)cout <<dist[i] <<" ";
// cout <<endl;
if(neg == 0)cout <<"No"<<endl;
else cout <<"Yes"<<endl;
return 0;
}
对于差分约束以不等式形式给出,用SPFA,否则要用带权并查集