bzoj1202 [HNOI2005]狡猾的商人

昨天宛如一个傻子...(居然机房rank2??)做个珂谷公开赛,结果遇到了貌似很高深的带权并查集,然后一早上心血来潮就想学:百度一下,诶,食物链?我好像A了,bzoj1202?好像在哪里见过?哦,原来是个sb算法(莫非以前学过?)

这道题就是维护一个d数组记录月份到父亲节点的距离就行了

#include<cstdio>
#include<cstring>
using namespace std;
int fa[110],d[110];
int findfa(int x)
{
    if(x!=fa[x])
    {
        int t=findfa(fa[x]);
        d[x]+=d[fa[x]];
        fa[x]=t;
    }
    return fa[x];
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n,m,x,y,c;
        scanf("%d%d",&n,&m);
        for(int i=0;i<=n;i++)fa[i]=i, d[i]=0;
        
        bool bk=true;
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d%d",&x,&y,&c);x--;
            int fx=findfa(x),fy=findfa(y);
            if(fx!=fy)
            {
                d[fx]=d[y]-d[x]-c;
                fa[fx]=fy;
            }
            else
            {
                if(d[y]-d[x]!=c)bk=false;
            }
        }
        if(bk==true)printf("true\n");
        else printf("false\n");
    }
    return 0;
}

 

posted @ 2017-11-02 08:02  AKCqhzdy  阅读(156)  评论(0编辑  收藏  举报