输入样例
10 5
1 10 100
7 10 28
1 3 32
4 6 41
6 6 1
输出
1
因为输入描述的是闭区间,这里求【3-7】是求不出的,必须改为开区间
所以(0,10]=100, (6, 10]=28, (0, 3]=32
之后的问题就简单了
如果某一段区间的值和之前的值冲突则是错的
注意序列中可能存在负数,所以如果(0,10)=100, (0, 9)=1000是可能的
#include<cstdio>
#include<cmath>
int n, m, a, b, s, p[200005], w[200005];
void init() {
for(int i = 0; i <= n; i++) {
p[i] = i;
w[i] = 0;
}
}
int find(int x) {
if(p[x] != x) {
int t = p[x];
p[x] = find(p[x]);
w[x] += w[t];
}
return p[x];
}
int main() {
while(scanf("%d%d", &n, &m) != EOF) {
init();
int cnt = 0;
for(int i = 0; i < m; i++) {
scanf("%d%d%d", &a, &b, &s);
a--;
int fa = find(a);
int fb = find(b);
if(fa == fb) {
if(s != (w[a] - w[b])) cnt++;
}else {
p[fa] = fb;
w[fa] = s + w[b] - w[a];
}
}
printf("%d\n", cnt);
}
return 0;
}