1. 程式人生 > >JZOJ3453. 【NOIP2013中秋節模擬】連通塊(connect)

JZOJ3453. 【NOIP2013中秋節模擬】連通塊(connect)

mil 任務 The pro proc 同時 ini desc 模擬

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.

JZOJ3453. 【NOIP2013中秋節模擬】連通塊(connect)