3127 – Arbori xor

From Bitnami MediaWiki

Cerința

Se dă un arbore cu n noduri, în care fiecare muchie are asociat un număr natural. Se cere răspunsul la Q întrebări de forma: dacă u şi v sunt două noduri din arbore, care este valoarea xor a tuturor numerelor asociate muchiilor situate pe lanţul ce uneşte u şi v?

Date de intrare

Fișierul de intrare arbori_xorIN.txt conține pe prima linie numerele n şi Q, pe următoarele n-1 linii câte o pereche de numere naturale ce reprezintă extremităţile unei muchii din arbore urmată de un număr natural ce reprezintă valoarea muchiei, iar pe următoarele Q linii câte o pereche de numere naturale ce reprezintă nodurile pentru care se cere xor-ul valorilor de pe lanţul ce le uneşte .

Date de ieșire

Fișierul de ieșire arbori_xorOUT.txt va conține pe primele Q linii răspunsurile la cele Q cerinţe.

Restricții și precizări

  • 2 ≤ n ≤ 10.000
  • 1 ≤ Q ≤ 500.000
  • valorile asociate muchiilor sunt numere naturale cel mult egale cu 10.000

Exemplul 1

arbori_xorIN.txt:

5 2

1 2 7

1 3 4

3 4 1

4 5 13

1 5

3 2

arbori_xorOUT.txt:

8

3

Explicație: Pentru prima cerinţă avem 4 ^ 1 ^ 13 = 8, iar pentru a doua 4 ^ 7 = 3.

Exemplul 2

arbori_xorIN.txt:

99999999 2

1 2 7

1 3 4

3 4 1

4 5 13

1 5

3 2

Output:

Input conditions not satisfied.

Rezolvare

<syntaxhighlight lang="python3" line="1"> from collections import deque

def bfs(nod):

   global coada, s, t
   coada.append(nod)
   while coada:
       nod = coada.popleft()
       for i in range(len(L[nod])):
           vecin, cost = L[nod][i]
           if t[nod] == vecin:
               continue
           coada.append(vecin)
           t[vecin] = nod
           s[vecin] = s[nod] ^ cost

def query(a, b):

   return s[a] ^ s[b]

def verify_conditions(n, q):

   if 2 <= n <= 10000 and 1 <= q <= 500000:
       return True
   else:
       return False

fin = open("arbori_xorIN.txt", "r") fout = open("arbori_xorOUT.txt", "w")

coada = deque() L = [[] for _ in range(10009)] s = [0] * 10009 t = [0] * 10009

n, q = map(int, fin.readline().split())

if not verify_conditions(n, q):

   print("Input conditions not satisfied.")
   fin.close()
   fout.close()
   exit()

for _ in range(n-1):

   x, y, z = map(int, fin.readline().split())
   L[x].append((y, z))
   L[y].append((x, z))

bfs(1)

for _ in range(q):

   a, b = map(int, fin.readline().split())
   fout.write(str(query(a, b)) + '\n')

fin.close() fout.close()

</syntaxhighlight>