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

来源:互联网 发布:php 二进制转字符串 编辑:程序博客网 时间:2024/05/20 18:00

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

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

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;}


0 0