首页 > 代码库 > SDOI2008Cave 洞穴勘测
SDOI2008Cave 洞穴勘测
无限膜拜CLJ大牛……
不会动态树的弱弱在CLJ的帮助下AC了此题
我想到了并查集(人人都会想到的吧……囧),但不知道应该如何处理destroy操作……
其实 make操作的实质就是:把x节点到其所在集合代表元的路上所有有向边都反过来,然后就可以处理本体所需的所有操作了(自己想想为何)。
代码:
1 var i,n,m,x,y:longint; 2 ch,cha:char; 3 fa:array[0..210000] of longint; 4 function find(x:longint):longint; 5 begin 6 while x<>fa[x] do x:=fa[x]; 7 exit(x); 8 end; 9 procedure make(x:longint);10 var y,tmp:longint;11 begin12 y:=fa[x];fa[x]:=x;13 while y<>x do14 begin15 tmp:=fa[y];fa[y]:=x;16 x:=y;y:=tmp;17 end;18 end;19 procedure connect(x,y:longint);20 begin21 make(x);make(y);22 fa[x]:=y;23 end;24 procedure destroy(x,y:longint);25 begin26 make(x);27 fa[y]:=y;28 end;29 procedure query(x,y:longint);30 begin31 if find(x)<>find(y) then writeln(‘No‘) else writeln(‘Yes‘);32 end;33 procedure main;34 begin35 readln(n,m);36 for i:=1 to n do fa[i]:=i;37 for i:=1 to m do38 begin39 read(ch);cha:=‘a‘;while cha<>‘ ‘ do read(cha);readln(x,y);40 if ch=‘C‘ then connect(x,y)41 else if ch=‘D‘ then destroy(x,y)42 else query(x,y);43 end;44 end;45 46 begin47 main;48 end.
最后我想说一句:并查集还大有文章可做!
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。