Разбор
При помощи поиска в глубину вычислим XOR сумму между вершиной и всеми остальными вершинами. XOR сумму между вершинами и занесем в . Пусть — количество единиц, а — количество нулей в массиве . Тогда ответом на задачу будет число .
Пример
Рассмотрим граф, приведенный в примере.
Возле каждой вершины записана XOR сумма между и . Если для некоторых вершин и , то XOR сумма между ними равна , таким образом совершая вклад в общую сумму. XOR сумма для каждой пары вершин , для которой , дает вклад в общую сумму.
Следовательно ответ равен количеству пар вершин , для которых . Это число равно . Парами вершин, дающими в общую сумму, будут: .
Реализация алгоритма
Входной граф храним в списке смежности . Объявим массив .
vector<vector<pair<int,int> > > g; vector<int> x;
Функция dfs реализует поиск в глубину, который вычисляет XOR сумму между вершинами и . Текущая XOR сумма между и равна . Предком вершины является .
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); } }
Основная часть программы. Читаем входной граф.
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(make_pair(v, d)); g[v].push_back(make_pair(u, d)); }
Запускаем поиск в глубину из вершины .
dfs(1, 0, -1);
Вычисляем количество нулей и единиц в массиве .
ones = 0; for (i = 1; i <= n; i++) if (x[i] == 1) ones++; zeroes = n - ones;
Выводим ответ.
printf("%lld\n", 1LL * ones * zeroes);
Python реализация
Функция dfs реализует поиск в глубину, который вычисляет XOR сумму между вершинами и . Текущая XOR сумма между и равна . Предком вершины является .
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)
Основная часть программы. Читаем входной граф.
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))
Инициализируем массив .
x = [0] * (n + 1)
Запускаем поиск в глубину из вершины .
dfs(1)
Вычисляем количество нулей и единиц в массиве .
ones = sum(x) zeroes = n - ones
Выводим ответ.
print(ones * zeroes)