NOI2002 银河英雄传说
搞了几次才过。。。太弱了。。。
本题的关键想到扩展并查集,在基础并查集的基础上额外维护一个集合的大小和当前点在集合中的位置就可以了。
Code:
type node=record fa,d,l:longint;end; var f:array [0..30001] of node; m,a,b,i:longint; ch:char; function find(x:longint):longint; var i,j,p,q:longint; begin i:=x; while f[i].fa<>i do i:=f[i].fa; p:=i;i:=x; while i<>p do begin q:=f[i].fa; f[i].fa:=p; j:=q; repeat inc(f[i].d,f[j].d); j:=f[j].fa until f[j].fa=j; i:=q; end; find:=p; end; procedure union(a,b:longint); begin a:=find(a); b:=find(b); f[a].fa:=b; f[a].d:=f[b].l; inc(f[b].l,f[a].l) end; begin readln(m); for i:=1 to 30000 do begin f[i].fa:=i; f[i].l:=1; end; for i:=1 to m do begin readln(ch,a,b); if ch='M' then union(a,b) else if (find(a)=find(b)) then writeln(abs(f[a].d-f[b].d)-1) else writeln(-1); end; end.