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;
}
现在虽然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;
}
相关文章推荐
- poj 1182 并查集经典题…
- poj&nbsp;1308&nbsp;Is&nbsp;It&nbsp;A&nbsp;Tree?(并查集)
- POJ 1182 食物链
- POJ 1703 && poj 1182【典型并查集】
- 并查集初学(4)向量思维 POJ1182(食物链)&& POJ1703
- CSU-ACM2017暑期训练10-并查集&&HASH C - 食物链 POJ - 1182 (并查集好题)
- poj&nbsp;2236&nbsp;并查集
- poj 1182 食物链 && nyoj 207(种类并查集)
- Hdu 1829 A Bug's Life && Poj 1182 食物链 (并查集偏移量的应用)
- poj 1988_并查集(*)
- poj 1703 并查集的拓展
- poj1182->食物连->并查集
- poj 1182 食物链 && nyoj 207(种类并查集)
- poj 1611 并查集训练
- POJ1703 && POJ2942 &&POJ 1182 并查集 这个做法挺巧妙
- nyist 207&&poj 1182 食物链(并查集)
- POJ1703 && POJ2942 &&POJ 1182 并查集 这个做法挺巧妙
- ACM: 线段树 poj 2777 继续熟练线…
- ACM: 动态规划题 poj 2948
- ACM: 动态规划题 poj&nb…