网站大量收购独家精品文档,联系QQ:2885784924

poj 1182分析和总结分析和总结.docx

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
由于前几天一直没搞懂并查集,现在搞懂了才做出来,所以交得有点晚了通过率:28% 难度:较难 食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 17611 Accepted: 4934 Description 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形。A 吃 B, B 吃 C,C 吃 A。 现有 N 个动物,以 1-N 编号。每个动物都是 A,B,C 中的一种,但是我们并不知道它到底是哪一种。 有人用两种说法对这 N 个动物所构成的食物链关系进行描述: 第一种说法是1 X Y,表示 X 和 Y 是同类。 第二种说法是2 X Y,表示 X 吃 Y。 此人对 N 个动物,用上述两种说法,一句接一句地说出K 句话,这K 句话有的是真的,有的是假的。当一句话满足下列三条之一时,这句话就是假话,否则就是真话。 当前的话与前面的某些真的话冲突,就是假话; 当前的话中 X 或 Y 比 N 大,就是假话; 当前的话表示 X 吃 X,就是假话。 你的任务是根据给定的 N(1 = N = 50,000)和K 句话(0 = K = 100,000), 输出假话的总数。 Input 第一行是两个整数 N 和 K,以一个空格分隔。 以下 K 行每行是三个正整数 D,X,Y,两数之间用一个空格隔开,其中 D 表示说法的种类。 若 D=1,则表示 X 和 Y 是同类。若 D=2,则表示 X 吃 Y。 Output 只有一个整数,表示假话的数目。 Sample Input 100 7 1 101 1 2 1 2 2 2 3 2 3 3 1 1 3 2 3 1 1 5 5 3 解题思路:使用并查集,若 x 与 y 有关系,则 x,y 在一个集合,用 rank[x] 存放 x 与 x 所在集合的代表元素,若 rank[x]=0,则表示 x 与代表元素同类, 若 1,则表示,代表元素吃x,若 2,则x 吃代表元素;输入d,x,y,使用递归函数查找 x,y 的祖先(即代表元素),若它们的祖先相等,则若满足(rank[x]-rank[y]+3)%3!=d-1,那么就有此句话是假话,若祖先不等,则 将 x 所在集合合并到 y 所在集合,让 y 的代表元素作为 x 所在集合代表元素的 父亲,如此循环,以上是判断地一条件的,对于二三条件可以直接判断,最后输出假话总数即可 总结及出错情况: 易出错的地方在于,误将没一句话的 x 都当做固定的 A 种类,还有就是在循环过程中要更新 x 到新祖先的所有元素对于新祖先的 rank[],在用到并查集的过程中,要用到查找祖先,即根节点,合并集合,易出错,还有就是在使用 c++ 时好像要超时,同样的算法,代码都基本相同的情况下,c 不会,建议使用 c 代码:#includestdio.h #includestdlib.h int father[50005]; int rank[50005]; int Find(int x) { int t; if(father[x]==x) return x; t=father[x]; father[x]=Find(father[x]); rank[x]=(rank[t]+rank[x])%3; return father[x]; } void Union(int a,int b,int c) { int ra=Find(a); int rb=Find(b); father[ra]=rb; rank[ra]=(rank[b]-rank[a]+3+c)%3; } int main() { int i,n,k; int d,x,y; int rx,ry; int sum=0; scanf(%d%d,n,k); for(i=1;i=n;i++) { father[i]=i; } while(k--) { scanf(%d%d%d,d,x,y); if(xn||yn||(d==2x==y)) { sum=sum+1; } else { rx=Find(x); ry=Find(y); if(rx==ry) { if((rank[x]-rank[y]+3)%3!=d-1) sum=sum+1; } else Union(x,y,d-1); } } printf(%d\n,sum); system(pause); return 0; }

文档评论(0)

tianya189 + 关注
官方认证
内容提供者

该用户很懒,什么也没介绍

认证主体阳新县融易互联网技术工作室
IP属地上海
统一社会信用代码/组织机构代码
92420222MA4ELHM75D

1亿VIP精品文档

相关文档