这次做食物链这个题目感觉真的好懵逼,先总结出现的错误,第一个是没有注意输入形式和输出格式,直接以为输入0 0就会结束,然后又是属于输入多组数据,但是题目并没有给出这样的提示,所以wa很正常,然后就是超时,想了一下昨天有人提到把cin改成scanf就AC了,所以我也试了一下;果然AC了,真的不容易啊。然后谈一下我做这个题目的各种懵逼,最开始连题目没看懂,感觉我就没有看懂几道题目过,然后条件2和3都很好理解,一就不同了,是指和前面的有出入,就有一个为假,我居然想去知道谁真谁假,这就不可能做出来了,手动再见。但是这个条件一就是要让我们用并查集了,真为一颗树 ,假为一棵树,然后find 函数,在判断吃与被吃关系就只能参考别人的代码了,因为这里真的好懵逼。所以我也不讲解什么,继续贴网址。
http://blog.csdn.net/niushuai666/article/details/6981689
#include<cstdio> using namespace std; struct node{ int fa,r; }p[50010]; int find(int x) { int temp; if(x==p[x].fa) return x; temp=p[x].fa; p[x].fa=find(temp); p[x].r=(p[x].r+p[temp].r)%3; return p[x].fa; } int main() { int n,m,num=0;int r1,r2; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { p[i].fa=i; p[i].r=0; } for(int i=0;i<m;i++) { int d,x,y; scanf("%d%d%d",&d,&x,&y); if(d==2&&x==y) {num++;continue;} if(x>n||y>n) {num++;continue;} r1=find(x);r2=find(y); if(r1!=r2) { p[r2].fa=r1; p[r2].r=(3+(d-1)+p[x].r-p[y].r)%3; } else { if(d==1&&p[x].r!=p[y].r) { num++; continue; } if(d==2&&((3-p[x].r+p[y].r)%3!=d-1)) { num++; continue; } } }printf("%d",num); return 0; }