tyvj 1721 岛屿

http://www.tyvj.cn/Problem_Show.asp?id=1721

可以看出这道题询问的是连通岛屿的多少,而与连接方式无关。操作则是将岛屿连通。自然,这道题应该运用并查集。因为要询问集合的大小,只要另开一个数组记录即可。

 

需要注意的是什么时候更新集合大小。

只需在建立新的父子关系的时候更新集合根节点的大小即可,路径压缩的时候不用更新。

因为这样可以保证每个集合的根节点储存的大小在任意时刻都是其集合的大小。

 

program tyvj_1721;
var fa,num:array[1..10000] of longint;
    n,m:longint;
//============================================================================
function getfa(x:longint):longint;
begin
  if fa[x]=x then getfa:=x else
  getfa:=getfa(fa[x]);
  fa[x]:=getfa;     //路径压缩
end;
//============================================================================
procedure main;
var i,q,c,s,t,f1,f2:longint;
begin
  readln(n,m);
  for i:=1 to n do
  begin
    fa[i]:=i;
    num[i]:=1;
  end;
  for i:=1 to m do
  begin
    read(q);
    if q=1 then
    begin
      readln(s,t);
      f1:=getfa(s); f2:=getfa(t);
      if f1<>f2 then
      begin
        writeln('No');
        inc(num[f2],num[f1]);
        fa[f1]:=f2;
      end else writeln('Yes');
    end else
    begin
      readln(c);
      f1:=getfa(c);
      writeln(num[f1]-1);
    end;
  end;
end;
//============================================================================
begin
  main;
end.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值