题目大意:
有 $n$ 个数,然后有一些诸如 $x_1-x_2\le c$ 或 $x_1-x_2\ge c$ 或 $x_1=x_2$ 的限制条件,问是否存在一组数满足条件。
解题牢骚:
啊,一道裸的差分约束系统,$x_1-x_2\ge c$ 可以转化为 $x_2-x_1\le -c$,然后跑最短路或最长路。妈的SPFA许久没写发现已然爆炸,连最基本的某个点已经在队列中就不用再入队的优化都忘记了。交了好多好多遍,想杀人。
还有啊,出题人十分明智的卡正常套路SPFA,我们可以用一种叫"SLF"的东西优化SPFA,即对于要入队的点 $v$,若其距离值小于队首元素的距离值,则将其插入至队首,否则入队尾,这不就是类似Dijkstra的无奈优化吗?自欺欺人罢了,然而不得不承认它跑的很快。另一种叫"LLL",与"SLF"有着异曲同工之处,在此不再赘述。
还有一个坑爹的细节是,可能图不连通,fuck被搞了好久!!
代码:

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <vector>
#include <queue>
#include <algorithm>
#define N 10005
using namespace std;
inline int read() {
    int x=0,f=1; char ch=getchar();
    while(ch<'0'||ch>'9') {if(ch=='-')f=-1; ch=getchar();}
    while(ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();}
    return x*f;
}
int n, m, dis[N], num[N];
vector<int> g[N], len[N];
deque<int> Q; bool in[N];

bool SPFA() {
    for(int i=0; i<=n; i++) dis[i] = 1000000000;
    memset(num, 0, sizeof(num));
    memset(in, false, sizeof(in));
    dis[0] = 0; Q.push_back(0); in[0] = 1;
    while( !Q.empty()) {
        int u = Q.front(); Q.pop_front(); in[u] = 0;
        int sz = g[u].size();
        for(int i=0; i<sz; i++) {
            int v = g[u][i], w = len[u][i];
            if(dis[v] > dis[u] + w) {
                dis[v] = dis[u] + w;
                if( !in[v]) {
                    in[v] = true;
                    if(dis[v] < dis[Q.front()]) Q.push_front(v);
                    else Q.push_back(v);
                    if((++num[v]) > (2 * n)) return false;
                }
            }
        }
    }
    return true;
}

int main() {
    n=read(); m=read();
    for(int i=1; i<=m; i++) {
        int opt = read();
        int a = read(), b = read();
        if(opt == 3) {
            g[a].push_back(b); len[a].push_back(0);
            g[b].push_back(a); len[b].push_back(0);
        }
        else if(opt == 1) {
            int c = read();
            g[a].push_back(b); len[a].push_back(-c);
        }
        else if(opt == 2) {
            int c = read();
            g[b].push_back(a); len[b].push_back(c);
        }
    }
    
    for(int i=1; i<=n; i++) { g[0].push_back(i); len[0].push_back(0); }

    puts(SPFA() ? "Yes" : "No");
    
    return 0;
}