权值线段树:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn = 100007;
int f[maxn],d[maxn];
int n,m,l,r,v;
int find(int x)
{
if(x==f[x])return x;
int now = f[x];
f[x]=find(f[x]);
d[x]=d[x]+d[now];
return f[x];
}
int main()
{
scanf("%d %d",&n,&m);
int ok = 1;
for(int i=1;i<=n;i++)f[i]=i;
for(int i=1;i<=m;i++)
{
scanf("%d %d %d",&l,&r,&v);
int fl = find(l);
int fr = find(r);
if(fl==fr)
{
if(d[l]-d[r]!=v)ok = 0;
}
else
{
f[fl]=fr;
d[fl]=v+d[r]-d[l];
}
}
if(ok)cout<<"Yes"<<endl;
else cout<<"No"<<endl;
return 0;
}
本文介绍了一种基于权值线段树的数据结构实现方法,通过处理一系列区间更新操作来维护一组整数的相对关系。具体实现了并查集与差分数组结合的算法,用以判断经过一系列操作后,相同集合内的元素间的关系是否符合指定条件。
3108

被折叠的 条评论
为什么被折叠?



