[kuangbin带你飞]专题五 并查集 E POJ 1182

来源:互联网 发布:linux c gbk转utf8 编辑:程序博客网 时间:2024/05/16 09:51

题目地址:https://vjudge.net/contest/66964#problem/E

思路:虽然知道是带权并查集,但是还是找不到表达的方法。这道题有一篇题解写的很好理解,推荐一下。

大神题解:http://blog.csdn.net/c0de4fun/article/details/7318642/

AC代码:

#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int maxn=50000+10;int fa[maxn],a[maxn];int n,k;int find(int p){    if(p==fa[p])        return p;    int old=fa[p];    fa[p]=find(fa[p]);    a[p]=(a[p]+a[old])%3;    return fa[p];}void merge(int d,int p,int q){    int fp,fq;    fp=find(p);    fq=find(q);    if(fp==fq)        return;    fa[fp]=fq;    a[fp]=(a[q]+d-a[p]+3)%3;    return;}bool istrue(int d,int p,int q){    int fp,fq;    if(p>n || q>n || (d==2 && p==q))        return false;    fp=find(p);    fq=find(q);    if(fp!=fq)        return true;    else    {        if(a[p]==((d-1)+a[q])%3)            return true;        else            return false;    }}int main(){    scanf("%d%d",&n,&k);    for(int i=0;i<=n;i++)    {        fa[i]=i;        a[i]=0;    }    int ans=0;     for(int i=1;i<=k;i++)     {         int d,a,b;         scanf("%d%d%d",&d,&a,&b);         if(!istrue(d,a,b))         ans++;         else        merge(d-1,a,b);        //printf("%d\n",ans);     }    printf("%d\n",ans);}


0 0
原创粉丝点击