您的位置:首页 > 其它

bzoj 1202: [HNOI2005]狡猾的商人

2016-03-03 23:02 274 查看
#include<cstdio>
#include<iostream>
#define M  1005
using namespace std;
int fa[M],T,n,m,v[M],kg;
int zhao(int a1)
{
if(fa[a1]==a1)
return a1;
int  t=zhao(fa[a1]);
v[a1]+=v[fa[a1]];
fa[a1]=t;
return t;
}
int main()
{
scanf("%d",&T);
for(;T;T--)
{
scanf("%d%d",&n,&m);
for(int i=0;i<=n;i++)
{
fa[i]=i;
v[i]=0;
}
kg=1;
for(int i=1;i<=m;i++)
{
int a1,a2,a3,x,y;
scanf("%d%d%d",&a1,&a2,&a3);
x=zhao(a1-1);
y=zhao(a2);
if(x!=y)
{
fa[y]=x;
v[y]=v[a1-1]+a3-v[a2];
}
else if(v[a2]-v[a1-1]!=a3)
kg=0;
}
if(kg)
printf("true\n");
else
printf("false\n");
}
return 0;
}


这好像是一个差分约束,用前缀和数组与读入的条件建边,发现所有的条件都是等于,所以可以用并查集维护,维护到祖先节点的距离。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: