并查集11分求助
查看原帖
并查集11分求助
385049
111abcd楼主2023/5/11 21:26
#include <cstdio>
#include <algorithm>
#define ll long long
using namespace std;

const int N = 1e2 + 5;
int t, n, m, fa[N], sz[N], v[N];
ll w[N];
int find(int x, ll & weight) {
	weight = 0;
	while (x != fa[x]) {
		weight += w[x];
		x = fa[x];
	}
	return x;
}
void merge(int x, int y, ll wx, ll wy, int d) {
	if (sz[x] > sz[y]) {
		swap(x, y);
		swap(wx, wy);
		d = -d;
	}
	fa[x] = y;
	sz[y] += sz[x];
	w[x] = wy - wx - d;
}

int main() {
	scanf("%d", &t);
	while (t--) {
		scanf("%d%d", &n, &m);
		for (int i = 1; i <= n; i++) fa[i] = i, sz[i] = 1, w[i] = 0;
		bool tf = 1;
		for (int i = 1; i <= m; i++) {
			int x, y, v;
			scanf("%d%d%d", &x, &y, &v);
			x--;
			ll wx, wy;
			x = find(x, wx); y = find(y, wy);
			if (x == y) {
				if (wy - wx != v) tf = 0;
			} else {
				merge(x, y, wx, wy, v);
			}
		}
		if (tf) puts("true");
		else puts("false");
	}
	return 0;
}
2023/5/11 21:26
加载中...