Dərinlik üzrə axtarışın köməyi ilə 1-ci zirvə ilə qalan zirvələr arasında XOR cəmi hesablayacağıq. Zirvələr 1 və arasında XOR cəmini -yə yerləşdirəcəyik. Gəlin -ləri massivindəki birlərin, və -ləri sıfırların sayı olaraq təyin edək (ones + zeroes = n). Onda məsələnin cavabı ones \cdot zeroes sayına bərabərdir.
Nümunə
Qraf və onun misalını nəzərdən keçirək.
Hər bir zirvənin yanında 1 və arasındaki XOR cəmi yazılır. Əgər x[v] = x[u] bərabərdirsə zirvələr və , onda onların aralarındaki XOR cəmi olur, beləliklə, toplam verir. x[v] \ne x[u] olan hər bir zirvə cütlüyü üçün XOR cəmi toplamda verir.
Nəticədə cavab x[v] \ne x[u] olan zirvə cütlüklərinin sayına bərabərdir. Bu say ones \cdot zeroes = 2 \cdot 3 = 6 olur. Toplamı 1 edən zirvə cütləri olacaq: (1, 2), (1, 4), (2, 3), (2, 5), (3, 4), (4, 5).
Alqoritmin reallaşdırılması
Giriş qrafını qonşuluq siyahısında saxlayaq. massivini elan edək.
vector<vector<pair<int,int> > > g;
vector<int> x;dfs funksiyası 1 və zirvələri arasında XOR cəmini hesablayan dərinlik üzrə axtarışı reallaşdırır. 1 və arasında cari XOR cəmi cur\_xor bərabərdir. Zirvə -nin ata nöqtəsi -dir.
void dfs(int v, int cur_xor, int p = -1)
{
x[v] = cur_xor;
for (auto z : g[v])
{
int to = z.first;
int w = z.second;
if (to != p) dfs(to, cur_xor ^ w, v);
}
}Proqramın əsas hissəsi. Giriş qrafını oxuyuruq.
scanf("%d", &n);
g.resize(n + 1);
x.resize(n + 1);
for (i = 1; i < n; i++)
{
scanf("%d %d %d", &u, &v, &d);
g[u].push_back({v, d});
g[v].push_back({u, d});
}Dərinlik üzrə axtarışı 1 zirvəsindən başladırıq.
dfs(1, 0, -1);massivindəki sıfırlar və birləri sayını hesablayırıq.
ones = 0;
for (i = 1; i <= n; i++)
if (x[i] == 1) ones++;
zeroes = n - ones;Cavabı çıxışa veririk.
printf("%lld\n", 1LL * ones * zeroes);Python reallaşdırılması
dfs funksiyası 1 və zirvələri arasında XOR cəmini hesablayan dərinlik üzrə axtarışı reallaşdırır. 1 və arasında cari XOR cəmi cur\_xor bərabərdir. Zirvə -nin ata nöqtəsi -dir.
def dfs(v, cur_xor = 0, p = -1):
x[v] = cur_xor
for to, w in g[v]:
if to != p:
dfs(to, cur_xor ^ w, v)Proqramın əsas hissəsi. Giriş qrafını oxuyuruq.
n = int(input())
g = [[] for _ in range(n + 1)]
for _ in range(n - 1):
u, v, d = map(int, input().split())
g[u].append((v, d))
g[v].append((u, d))massivini iniləşdiririk.
x = [0] * (n + 1)Dərinlik üzrə axtarışı 1 zirvəsindən başladırıq.
dfs(1)massivindəki sıfırlar və birləri sayını hesablayırıq.
ones = sum(x)
zeroes = n - onesCavabı çıxışa veririk.
print(ones * zeroes)