zoukankan      html  css  js  c++  java
  • NOI2002银河英雄传说

    原先就看过这道题,觉得很复杂。

    不知道为什么今天一看觉得好水啊……

    难道这就是并查集的启发式合并?

    数组d【i】表示i到其父节点的距离,即中间隔了多少船舰。

    数组sum【i】记录以i为根的集合总共有多少个元素,将新节点插入的时候距离设为sum【i】就好了。

    代码:

     1 var  fa,d,sum:array[0..30001] of longint;
     2      t,i,xx,yy,x,y:longint;
     3      ch:string[1];
     4 function find(x:longint):longint;
     5 var tmp:longint;
     6 begin
     7 tmp:=fa[x];
     8 if fa[x]<>x then fa[x]:=find(fa[x]);
     9 d[x]:=d[x]+d[tmp];
    10 exit(fa[x]);
    11 end;
    12 procedure main;
    13 begin
    14 readln(t);
    15 for i:=1 to 30001 do begin fa[i]:=i;d[i]:=0;sum[i]:=1;end;
    16 for i:=1 to t do
    17   begin
    18   readln(ch,x,y);
    19   xx:=find(x);yy:=find(y);
    20   if ch='C'then
    21       begin
    22       if xx<>yy then writeln('-1') else writeln(abs(d[y]-d[x])-1);
    23       end
    24   else
    25       begin
    26       fa[xx]:=yy;d[xx]:=sum[yy];inc(sum[yy],sum[xx]);sum[xx]:=0;
    27       end;
    28   end;
    29 end;
    30 begin
    31 main;
    32 end.
    View Code

    1A……

  • 相关阅读:
    重排序
    线程的生命周期状态
    并发的有序性
    并发的可见性
    并发的原子性
    Java内存模型
    缓存一致性协议MESI
    lsof
    nmap
    elastcisearch简介
  • 原文地址:https://www.cnblogs.com/zyfzyf/p/3782552.html
Copyright © 2011-2022 走看看