您的位置:首页 > 其它

poj 1182 并查集

2013-04-14 19:37 363 查看
第一次wa是因为负数的问题

现在虽然ac了 不过还是有一点小问题

赶着睡觉

晚上再处理

#include <iostream>

#include<stdio.h>

#include<string.h>

using namespace std;

const int maxn=50001;

struct

{

int
fa,re;

}f[maxn];

int ans;

int findre(int x)

{

if(f[x].fa!=x)

return((f[x].re+findre(f[x].fa)+3)%3);

return((f[x].re+3)%3);

}

int find(int x)

{

if(f[x].fa!=x)

{

f[x].re+=findre(f[x].fa);

f[x].re%=3;

f[x].fa=find(f[x].fa);

}

return(f[x].fa);

}

int main()

{

//
freopen("in.txt","r",stdin);

int
n,k;

scanf("%d
%d",&n,&k);

for(int
i=1;i<=n;i++)

{

f[i].fa=i;

f[i].re=0;

}

ans=0;

for(int
i=1,a,b,c;i<=k;i++)

{

scanf("%d %d
%d",&c,&a,&b);

if(a>n||b>n)

{

ans++;

continue;

}

else if(c==1)

{

int f1=find(a);

int f2=find(b);

if(f1!=f2)

{

f[f2].re=findre(a)-findre(b);

f[f2].fa=f1;

}

else

{

int r1=findre(a);

int r2=findre(b);

if(r1%3!=r2)

ans++;

}

}

else

{

int f1=find(a);

int f2=find(b);

if(f1!=f2)

{

f[f2].re=findre(a)+1-findre(b);

//
if(f[f2].re<0)

//
f[f2].re+=-(f[f2].re/3*3)+9;

f[f2].fa=f1;

}

else

{

int r1=findre(a);

int r2=findre(b);

if((r1+1)%3!=r2)

ans++;

}

}

}

// for(int
i=1;i<=n;i++)

// printf("%d
%d\n",find(i),findre(i));

printf("%d\n",ans);

return
0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: