Zjnu Stadium HDU - 3047 带权并查集板子题

#include
#include
#include
using namespace std;
const int N=200000+10;
int p[N];
int w[N];
int find(int x)
{
    if(p[x]==x)
        return x;
    int root=find(p[x]);
    w[x]+=w[p[x]];
    p[x]=root;
    return p[x]; 
}
int n,m;
int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        for(int i=1;i<=n;i++)
            p[i]=i,w[i]=0;
        int ans=0;
        for(int i=1;i<=m;i++)
        {
            int a,b,c;
            scanf("%d%d%d",&a,&b,&c);
            int pa=find(a);
            int pb=find(b);
            if(pa==pb)
            {
                if(w[a]+c!=w[b])
                    ans++;
            }
            else
            {
                p[pb]=pa;
                w[pb]=w[a]-w[b]+c;
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

 

你可能感兴趣的:(Zjnu Stadium HDU - 3047 带权并查集板子题)