如题.
#include "bits/stdc++.h"
#define ll long long
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
using namespace std;
struct Node {
int id;
ll dis;
};
int fr[550000];
ll dis[550000];
int T, n, m;
Node Findroot(int x) {
if (fr[x] == x) {
Node p;
p.id = x;
p.dis = 0ll;
return p;
}
Node _p = Findroot(fr[x]), __p;
fr[x] = _p.id;
dis[x] = _p.dis + dis[x];
__p.id = fr[x];
__p.dis = dis[x];
return __p;
}
bool Union(int x, int y, ll Dis) {
Node xp = Findroot(x);
Node yp = Findroot(y);
if (xp.id == yp.id) {
if ((xp.dis - yp.dis) != Dis) return false;
else return true;
} else {
fr[y] = x;
dis[y] = Dis + xp.dis - yp.dis;
return true;
}
}
void Main() {
scanf ("%d%d", &n, &m);
for (int i = 1; i <= n; ++i) {
fr[i] = i;
dis[i] = 0ll;
}
for (int i = 1; i <= m; ++i) {
int a, b;
ll D;
scanf ("%d%d%lld", &a, &b, &D);
if (!(Union(a, b, D))) {
puts("NO");
return;
}
}
puts("YES");
}
int main() {
// freopen ("queue.in", "r", stdin);
// freopen ("queue.out", "w", stdout);
scanf ("%d", &T);
while (T--) {
Main();
}
}
不会是路径压缩假了吧