链接:http://poj.org/problem?id=1182
题意应该没什么问题,因为是中文的。自己写了一个TLE。搞不懂。自己能优化的地方就只有路径的修改,没有其它方法更快了。
然后看解题报告,真不简单啊。即使看了解题报告也不大清楚。主要是公式自己也没推。这里放两个解题报告吧。以后领悟了,能看看。
http://blog.csdn.net/c0de4fun/article/details/7318642/
http://blog.csdn.net/tiantangrenjian/article/details/7085575
代码基本上是抄袭的啦,不多说了。
#include<stdio.h>
#include<string.h>
#define MAXN 50005
int set[MAXN];
int rank[MAXN];
int find(int x)
{
if(x!=set[x])
{
int fx=find(set[x]);
rank[x]=(rank[x]+rank[set[x]])%3;
set[x]=fx;
}
return set[x];
}
int merge(int x,int y,int type)
{
int fx=find(x);
int fy=find(y);
if(fx==fy)
{
if((rank[y]-rank[x]+3)%3!=type)
return 0;
else return 1;
}
set[fy]=fx;
rank[fy]=(rank[x]-rank[y]+type+3)%3;
return 1;
}
int main()
{
int n,m,i,ans;
int d,x,y;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
set[i]=i;
memset(rank,0,sizeof(rank));
ans=0;
for(i=0;i<m;i++)
{
scanf("%d%d%d",&d,&x,&y);
if(x>n||y>n||(x==y&&d==2))
ans++;
else if(!merge(x,y,d-1))
ans++;
}
printf("%d\n",ans);
return 0;
}