信息学【并查集练习】食物链——题解报告
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• 判断是否为谎话怎么做呢? • 条件x与y是同类,若x与y在同一个集合内,则color[x]=color[y]时为真 话,否则合并集合。 • 条件x吃y,x与y在同一个集合内,则(color[x]+1)mod 3=color[y]时为真 话,否则合并集合。
• 源代码如下:
• • • • • • • • • • • • • • • •
• 有了这个操作,后面的修改就简单多了。 • • • • 若x和y是同类,要合并两个所在的集合 设fx为x的父亲节点,fy为y的父亲节点 color[fy]:=(color[x]-color[y]+3)mod 3 在此次操作后,再经过getfather函数的 color[son]:=(color[son]+color[father[son]])mod 3; • color[y]=(color[x]-color[y]+3)+color[y] • =color[x]+3 //为了看得方便,删掉了mod 3,不会影响结果 color[x] (mod 3) •
var i,k,n,d,x,y,x2,y2,sum:longint; f,color:array[1..50000]of longint; function getfather(son:longint):longint; begin if f[son]=0 then begin exit(son) end else begin getfather:=getfather(f[son]); color[son]:=(color[f[son]]+color[son])mod 3; f[son]:=getfather; end; end;
• 谢谢! • 欢迎指出错误!
若x吃y,即color[x]+1 color[y],合并两集合 设fx为x的父亲节点,fy为y的父亲节点 color[fy]:=(color[x]-color[y]+4)mod 3 在此次操作后,再经过getfather函数的 color[son]:=(color[son]+color[father[son]])mod 3; • color[y]=(color[x]-color[y]+4)+color[y] • =color[x]+4 //为了看得方便,删掉了mod 3,不会影响结果 color[x] (mod 3) • • • • •
【并查集】食物链
题解报告
By Crazy
• • • •
设三种动物种类编号分别为0,1,2。 定义数组color表示动物的编号。 显然,如果x和y是同类,那么color[x]=color[y] 如果x吃y,那么(color[x]+1)mod 3=color[y]
那么怎么保证两组集合合并时其中元素的color合法呢? 在这里先介绍getfather函数的修改操作 function getfather(son:longint):longint; begin if father[son]=0 then exit(son); getfather:=getfather(father[son]); color[son]:=(color[son]+color[father[son]])mod 3; father[son]:=getfather; end;
• • • • • • • • • • • • • • • • • • • • • • • • • • •
else begin if x=y then begin inc(sum); continue; end; x2:=getfather(x); y2:=getfather(y); if x2=y2 then begin if (color[x]+1)mod 3=color[y] then continue else inc(sum); end else begin f[y2]:=x2; color[y2]:=(color[x]-color[y]+4)mod 3; end; end; end; writeln(sum); close(input); close(output); end.
• • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • •
begin assign(input,'foodchain.in'); assign(output,'foodchain.out'); reset(input); rewrite(output); readln(n,k); sum:=0; for i:=1 to k doቤተ መጻሕፍቲ ባይዱbegin readln(d,x,y); if (x>n)or(y>n)then begin inc(sum); continue; end; if d=1 then begin if x=y then continue; x2:=getfather(x); y2:=getfather(y); if x2=y2 then begin if color[x]=color[y]then continue else inc(sum); end else begin f[y2]:=x2; color[y2]:=(color[x]-color[y]+3)mod 3; end; end