您的位置:首页 > 其它

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

2016-10-16 15:20 405 查看
题目地址: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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: