3127 – Arbori xor
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.0001 ≤ 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>