3127 – Arbori xor

De la Universitas MediaWiki
Versiunea pentru tipărire nu mai este suportată și poate avea erori de randare. Vă rugăm să vă actualizați bookmarkurile browserului și să folosiți funcția implicită de tipărire a browserului.

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

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()