fork download
  1. program connessioni;
  2. const MAXN =200000;
  3. Qsize=400000;
  4. var
  5. N, Q, ricorda, conta,contazone,a ,b, h,i, j, w, z,x, y, risul: longint;
  6. graph : array[0..MAXN-1] of array of longint;
  7. gsize, gcapa: array[0..MAXN-1] of longint;
  8. visited : array[0..MAXN-1] of boolean;
  9. S,E,dist : array[0..MAXN-1] of longint;
  10. q1, q2 : array[0..QSIZE-1] of longint;
  11. uscita: boolean;
  12.  
  13. procedure bfs(b : longint; var res : array of longint);
  14. var qhead, qcount, first, second, j : longint;
  15.  
  16. begin
  17. q1[0] := b; q2[0] := 0;
  18. qhead := 0; qcount := 1;
  19. while qcount > 0 do
  20. begin
  21. first := q1[qhead];
  22. second := q2[qhead];
  23. inc(qhead);
  24. if qhead = QSIZE then
  25. qhead := 0;
  26. dec(qcount);
  27. if visited[first] then
  28. continue;
  29. visited[first] := True; ricorda:=first;
  30. conta:=conta+1; (*memorizza il numero di nodi visitati*)
  31. res[first] := second;
  32. for j:=0 to gsize[first]-1 do
  33. begin
  34. q1[(qhead + qcount) mod QSIZE] := graph[first][j];
  35. q2[(qhead + qcount) mod QSIZE] := second + 1;
  36. inc(qcount);
  37. end;
  38. end;
  39. end;
  40.  
  41. procedure inizia (N: longint);
  42. begin
  43. for h:=0 to N-1 do
  44. begin
  45. setlength(graph[h], 1);
  46. (* all’inizio, la lista di adiacenza del nodo i ha dimensione 0
  47.   * e capacita’ 1.
  48.   *)
  49. gsize[h] := 0;
  50. gcapa[h] := 1;
  51. dist[h] := maxlongint;
  52. end;
  53. end;
  54.  
  55. function collega (x,y:longint):longint;
  56. begin
  57. S[i]:=x; E[i]:=y;
  58. j:=1;
  59. while j<=Q do
  60. begin
  61. for h:=0 to N-1 do visited[h]:=false;
  62. inizia(N);
  63. for h:=0 to j-1 do
  64. begin
  65. a := S[h]; b :=E[h];
  66. (* se ho esaurito i posti nella lista di adiacenza del nodo a *)
  67. if gsize[a] = gcapa[a] then
  68. begin
  69. (* allora raddoppio la sua capacita’ *)
  70. gcapa[a] := gcapa[a] shl 1;
  71. setlength(graph[a], gcapa[a]);
  72. end;
  73. graph[a][gsize[a]] := b;
  74. inc(gsize[a]);
  75. (* se ho esaurito i posti nella lista di adiacenza del nodo b *)
  76. if gsize[b] = gcapa[b] then
  77. begin
  78. (* allora raddoppio la sua capacita’ *)
  79. gcapa[b] := gcapa[b] shl 1;
  80. setlength(graph[b], gcapa[b]);
  81. end;
  82. graph[b][gsize[b]] :=a;
  83. inc(gsize[b]);
  84. end;
  85. contazone:=1; conta:=0;
  86. bfs(0,dist);
  87. while conta<N do
  88. begin
  89. w:=0; uscita:=false;
  90. contazone:=contazone+1;
  91. while (uscita=false) and (w<N) do if visited[w]=true then w:=w+1
  92. else begin uscita:=true;ricorda:=w; end;
  93. bfs(ricorda,dist);
  94. end;
  95. collega:=contazone; j:=j+1; end;
  96. end;
  97.  
  98. begin
  99. (*assign(input, 'input.txt'); reset(input);
  100.   assign(output, 'output.txt'); rewrite(output);*)
  101. readln(N, Q);
  102. inizia(N);
  103. for i:=0 to Q-1 do
  104. begin
  105. readln (x,y);
  106. writeln (collega(x,y));
  107. end;
  108. end.
  109.  
Success #stdin #stdout 0.01s 6444KB
stdin
10 15
7 9
3 2
7 9
4 0
7 9
5 1
0 4
6 2
6 3
7 9
8 4
1 5
8 9
6 8
9 0
stdout
9
8
8
7
7
6
6
5
5
5
4
4
3
2
2