bzoj1202 狡猾的商人(带权并查集)

来源:互联网 发布:沙宝亮的唱功 知乎 编辑:程序博客网 时间:2024/05/20 18:00

还是那句话,注意方向。

#include<cstdio>#include<cstring>int fa[101],d[101];int find(int x){    if(x==fa[x]) return x;    int xx=find(fa[x]);    d[x]+=d[fa[x]];    return fa[x]=xx;}//边都指向小的数。d[x]表示fa[x]+1...x的和 int main(){//  freopen("a.in","r",stdin);    int w;    scanf("%d",&w);    while(w--){        int n,m;        scanf("%d%d",&n,&m);        for(int i=0;i<=n;++i) fa[i]=i;        memset(d,0,sizeof(d));        //注意初始化数组~         bool flag=1;        while(m--){            int s,t,v;            scanf("%d%d%d",&s,&t,&v);            s--;            int xx=find(s),yy=find(t);            if(xx!=yy) fa[yy]=xx,d[yy]=d[s]+v-d[t];            //d[yy]表示yy指向xx的边,即xx+1月到yy月的和。画向量图推。             else if(d[t]-d[s]!=v){                flag=0;break;            }         }        if(flag) puts("true");        else puts("false");    }    return 0;}
原创粉丝点击