link
code
#include <iostream>
#include <cstdio>
#include <queue>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 5005;
int dis[N], cnt[N], vis[N];
int head[N];
struct edge
{
int to, nxt, val;
}e[N << 2];
int tot, n, m;
inline void add(int u, int v, int w){
e[++tot].to = v;
e[tot].val = w;
e[tot].nxt = head[u];
head[u] = tot;
}
int spfa(int x){
queue<int> q;
q.push(x);
cnt[x]++;
dis[x] = 0;
while(q.size()){
int u = q.front();
q.pop();
vis[u] = 0;
for (int i = head[u]; ~i; i = e[i].nxt)
{
int v = e[i].to;
if (dis[v] > dis[u] + e[i].val)
{
dis[v] = dis[u] + e[i].val;
if (!vis[v])
{
q.push(v);
vis[v] = 1;
if (++cnt[v] > n)
{
return 0;
}
}
}
}
}
return 1;
}
int main(int argc, char const *argv[])
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
memset(head, -1 ,sizeof head);
memset(dis, 0x3f, sizeof dis);
cin >> n >> m;
for (int i = 0, op, a, b, c; i < m; ++i)
{
cin >> op;
if (op == 1)
{
cin >> a >> b >> c;
add(a, b, -c);
}else if(op == 2){
cin >> a >> b >> c;
add(b, a, c);
}else{
cin >> a >> b;
add(a, b, 0);
add(b, a, 0);
}
}
for (int i = 1; i <= n; ++i)
{
add(0, i, 0);
}
if (spfa(0))
{
cout << "Yes" << '\n';
}else{
cout << "No" << '\n';
}
return 0;
}