• HDU3038


    思路

    不解释了,带权并查集模板。

    AC代码

    #include<iostream>
    #include<string.h>
    #include<algorithm>
    #include<stdio.h>
    #include<cmath>
    #include<list>
    #include<stdlib.h>
    #include<stack>
    #include<stdio.h>
    #include<queue>
    using namespace std;
    typedef long long ll;
    #define sc(T) scanf("%d",&T)
    #define scc(x,y) scanf("%d %d",&x,&y)
    #define pr(T) printf("%d
    ",T)
    #define f(a,b,c) for (int a=b;a<c;a++)
    #define ff(a,b,c) for (int a=b;a>c;a--)
    #define inf 0x3f3f3f3f
    #define mem(a,b) memset(a,b,sizeof(a))
    #define eps 1e-9
    #define PI acos(-1)
    
    const int N=200020;
    int f[N],dis[N];
    
    int getf(int x)
    {
        if(f[x]==x)
            return x;
    //    int t=f[x];//找它的父节点
    //    f[x]=getf(f[x]);
    //    dis[x]=dis[x]+dis[t];//d[x](为x到根节点的距离)更新为它到它父节点的距离+父节点到根节点的距离
    //    return f[x];
        int t=getf(f[x]);
        dis[x]+=dis[f[x]];
        return f[x]=t;
    }
    
    //void merge(int x,int y)
    //{
    //    int t1=getf(x),t2=getf(y);
    //    f[t2]=t1;
    //}
    
    int main()
    {
        int n,m;
        while(~scc(n,m))
        {
            mem(dis,0); //必须清空 不然WA
            for(int i=1; i<=n; i++)
                f[i]=i;
            int ans=0;
            f(i,0,m)
            {
                int a,b,c;
                cin>>a>>b>>c;
                a--;
                int t1=getf(a),t2=getf(b);
                if(t1!=t2)
                {
                    f[t2]=t1;
                    dis[t2]=dis[a]+c-dis[b];
                }
                else
                {
                    if(dis[b]-dis[a]!=c)
                        ans++;
                }
            }
            pr(ans);
        }
        return 0;
    }
    
  • 相关阅读:
    深入理解hadoop之MapReduce
    centos关机与重启命令
    hadoop学习笔记(1)
    配置ssh免密码登录设置后还是提示需要输入密码
    js获得URL中的参数
    SQLite介绍
    sql记录
    sql游标使用
    sql触发器
    sql函数
  • 原文地址:https://www.cnblogs.com/OFSHK/p/13709019.html
Copyright © 2020-2023  润新知