您的位置:首页 > 大数据 > 人工智能

poj1182 Food Chain

2014-03-24 21:55 232 查看
链接: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;
}


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