
原先就看过这道题,觉得很复杂。
不知道为什么今天一看觉得好水啊……
难道这就是并查集的启发式合并?
数组d【i】表示i到其父节点的距离,即中间隔了多少船舰。
数组sum【i】记录以i为根的集合总共有多少个元素,将新节点插入的时候距离设为sum【i】就好了。
代码:
var fa,d,sum:array[..] of longint;
t,i,xx,yy,x,y:longint;
ch:string[];
function find(x:longint):longint;
var tmp:longint;
begin
tmp:=fa[x];
if fa[x]<>x then fa[x]:=find(fa[x]);
d[x]:=d[x]+d[tmp];
exit(fa[x]);
end;
procedure main;
begin
readln(t);
for i:= to do begin fa[i]:=i;d[i]:=;sum[i]:=;end;
for i:= to t do
begin
readln(ch,x,y);
xx:=find(x);yy:=find(y);
if ch='C'then
begin
if xx<>yy then writeln('-1') else writeln(abs(d[y]-d[x])-);
end
else
begin
fa[xx]:=yy;d[xx]:=sum[yy];inc(sum[yy],sum[xx]);sum[xx]:=;
end;
end;
end;
begin
main;
end.
1A……