题意
Bob有(N(1 leq N leq10000))个点的树,每条边有一个边权(d(0leq d leq 233)),现在定义(dis(i,j))代表第(i)个点到第(j)个点的距离模2。问有多少((i,j,k))满足(dis(i,j) = dis(i,k) = dis(j,k))。
题解
首先,一棵树中不存在((i,j,k)),使得(dis(i,j) = dis(i,k) = dis(j,k) = 1)。随便选一个点为根,记(dis(root, u) = 0)的个数为(cnt_x),(dis(root, u) = 1)的个数为(cnt_y),那么满足(dis(i,j) = dis(i,k) = dis(j,k) = 0)的((i, j,k))个数为(cnt_x^3 + cnt_y^3)。注意(i = j = k)是合法的!
代码
const int N = 10005;
int n, x, y;
vector<P> G[N];
void DFS(int u, int p, int deep) {
(deep & 1) ? ++x : ++y;
for (auto v : G[u]) if (v.first != p) DFS(v.first, u, deep + v.second);
}
void addedge(int u, int v, int w) {
G[u].pb(P(v, w));
G[v].pb(P(u, w));
}
int main()
{
cin >> n;
rep(i, 1, n) {
int u, v, w;
cin >> u >> v >> w;
addedge(u, v, w);
}
DFS(1, 1, 0);
cout << 1ll * x * x * x + 1ll * y * y * y << endl;
return 0;
}