3127 – Arbori xor

De la Universitas 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

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