RT 求调
#include<iostream>
#include<cstdio>
using namespace std;
const int N = 6005;
const int M = 6005;
int tot = 0,dis[N];
struct node{
int x,y,z;
}p[N+M];
void add(int u,int v,int w){
++tot;
p[tot].x = u;
p[tot].y = v;
p[tot].z = w;
}
int main(){
int n,m,opt,a,b,c;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
scanf("%d",&opt);
if(opt == 1){
scanf("%d%d%d",&a,&b,&c);
add(a,b,-c);
}else if(opt == 2){
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
}else if(opt == 3){
scanf("%d%d",&a,&b);
add(a,b,0);
add(b,a,0);
}
}
for(int i=1;i<=n;i++){
add(0,i,0);
}
for(int i=1;i<=n;i++){
dis[i] = 0x3f3f3f3f;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=tot;j++){
dis[p[j].x] = min(dis[p[j].x],dis[p[j].y] + p[j].z);
}
}
bool flag = false;
for(int i=1;i<=tot;i++){
if(dis[p[i].x] < dis[p[i].y] + p[i].z){
flag = true;
break;
}
}
if(flag){
puts("No");
}else{
puts("Yes");
}
}