您的位置:首页 > 运维架构

[HNOI2005]狡猾的商人(并查集维护前缀和)

2016-07-02 10:53 387 查看
并查集维护前缀和,实际上就是一个差分约束系统,但是这里面只有“=” 罢了,所以可以用并查集做

感觉很多题,自己做都没有恰当的思路,思路都很乱,并查集真的很灵活

val表示从到根节点相差多少。如果在一个集合里,通过减取差,即可知道他们之间的距离

不在一个集合的话,就把他们连起来

我想,以后做题,没有必要用最优解,我可以尝试用自己的方法来做,实在不行再看题解!!

#include<cstdio>
#include<algorithm>
#include<cstring>

using namespace std;

int fa[209],val[209],n,m;
int find(int x)
{
if (x==fa[x]) return x;
int k=find(fa[x]);
val[x]+=val[fa[x]];
return fa[x]=k;
}
int main()
{
int T;
scanf("%d",&T);
int s,t,v;
while(T--)
{
scanf("%d%d",&n,&m);
for (int i=0;i<=n+1;i++) fa[i]=i;
memset(val,0,sizeof(val));
bool o=true;
for (int i=1;i<=m;i++)
{
scanf("%d%d%d",&s,&t,&v);//多组数据要读入完!!
int fs=find(s-1),ft=find(t);
if (fs==ft)
if (val[s-1]-val[t]!=v) o=false;//所以这里不能有break;
if (fs!=ft)
{
fa[fs]=ft;
val[fs]=val[t]+v-val[s-1];
}
}
if (o) printf("true\n");else printf("false\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: