• JZOJ3453. 【NOIP2013中秋节模拟】连通块(connect)


    Description

      你应该知道无向图的连通块的数量,你应该知道如何求连通块的数量。当你兴奋与你的成就时,破坏王Alice拆掉了图中的边。当她发现,每删去一条边,你都会记下边的编号,同时告诉她当前连通块的个数。 
       然而,对边编号简直就是个悲剧,因为Alice为了刁难你,拆掉编号从l到r的边,当然你需要做的事情就是求连通块的个数。如果你答对了,Alice会把拆掉的边装好,迚行下一次破坏。如果你无法完成这个任务,Alice会彻底毁了你的图。 
      进行完足够多次之后,Alice觉得无聊,就玩去了,而你却需要继续做第三题。
     

    Input

      第一行两个整数n,m,表示点数和边数。 
      之后m行每行两个整数x,y,表示x与y之间有无向边。(按读入顺序给边编号,编号从1开始) 。
       一行一个整数k,表示Alice的破坏次数。 
       之后k行,每行两个整数l,r。 
     

    Output

       k行,每行一个整数。
     

    Solution

      用f[i] 表示连接1-i 的联通情况,是一个并查集。

      用g[i] 表示连接i-n 的联通情况,是一个并查集。

      对于删除的区间[l-r],只需将f[l-1]和g[r+1]的并查集合并。

     

    代码

     1 var
     2   n,m,k,ans:longint;
     3   fa:array [0..501] of longint;
     4   x,y:array [0..10001] of longint;
     5   fa1,fa2:array [0..10001,0..501] of longint;
     6 function get1(y,x:longint):longint;
     7 begin
     8   if fa1[y,x]=x then exit(x);
     9   fa1[y,x]:=get1(y,fa1[y,x]);
    10   exit(fa1[y,x]);
    11 end;
    12 
    13 function get2(y,x:longint):longint;
    14 begin
    15   if fa2[y,x]=x then exit(x);
    16   fa2[y,x]:=get2(y,fa2[y,x]);
    17   exit(fa2[y,x]);
    18 end;
    19 
    20 procedure init;
    21 var
    22   i,l,r,t1,t2:longint;
    23 begin
    24   readln(n,m);
    25   for i:=1 to m do
    26     readln(x[i],y[i]);
    27   for i:=1 to n do
    28     begin
    29       fa1[0,i]:=i;
    30       fa2[m+1,i]:=i;
    31     end;
    32   for i:=1 to m do
    33     begin
    34       l:=i; fa1[l]:=fa1[l-1];
    35       t1:=get1(l,x[l]);
    36       t2:=get1(l,y[l]);
    37       fa1[l,t2]:=t1;
    38       r:=m-i+1; fa2[r]:=fa2[r+1];
    39       t1:=get2(r,x[r]);
    40       t2:=get2(r,y[r]);
    41       fa2[r,t2]:=t1;
    42     end;
    43 end;
    44 
    45 function get(x:longint):longint;
    46 begin
    47   if fa[x]=x then exit(x);
    48   fa[x]:=get(fa[x]);
    49   exit(fa[x]);
    50 end;
    51 
    52 procedure main;
    53 var
    54   i,j,l,r,t1,t2,t3:longint;
    55 begin
    56   readln(k);
    57   for i:=1 to k do
    58     begin
    59       readln(l,r);
    60       fa:=fa1[l-1];
    61       for j:=1 to n do
    62         begin
    63           t1:=get(j);
    64           t2:=get(get2(r+1,j));
    65           fa[t2]:=t1;
    66         end;
    67       ans:=0;
    68       for j:=1 to n do
    69         if get(fa[j])=j then inc(ans);
    70       writeln(ans);
    71     end;
    72 end;
    73 
    74 begin
    75   assign(input,'connect.in');
    76   assign(output,'connect.out');
    77   reset(input);
    78   rewrite(output);
    79   init;
    80   main;
    81   close(input);
    82   close(output);
    83 end.
  • 相关阅读:
    moc处理cpp文件
    程序员!你还能年轻几岁?
    多媒体会议系统中的延迟
    把C++类成员函数集成到lua
    Q_PROPERTY使用
    python与c的集成
    注册C函数与类成员函数到lua
    摄像头(WebCam)在Linux操作系统中的驱动方法
    网络营销实战必读之书推荐:《网络营销实战密码》
    这样写的博客才有更多的人愿意看
  • 原文地址:https://www.cnblogs.com/zyx-crying/p/9497440.html
Copyright © 2020-2023  润新知