显示代码纯文本
#include <cstdio>
const int MAXN = 2e5 + 10;
struct EDGE {
int v, w, next;
} edge[MAXN << 1];
int head[MAXN], edgeNum;
void AddEdge(int u, int v, int w) {
edge[++edgeNum].v = v;
edge[edgeNum].w = w;
edge[edgeNum].next = head[u];
head[u] = edgeNum;
}
int ans;
int f[MAXN][4]; // f[i][0]: 0-0, f[i][1]: 1-1, f[i][2]: 0-1, f[i][3]: 1-0
void dfs(int now, int fa) {
for (int i = head[now]; i; i = edge[i].next) {
int v = edge[i].v, w = edge[i].w;
if (v == fa) continue;
dfs(v, now);
if (w) {
ans += 2 * (f[v][1] + 1) * (f[now][1] + 1);
ans += (f[v][0] + f[v][2]) * (f[now][1] + 1);
ans += (f[now][0] + f[now][2]) * (f[v][1] + 1);
f[now][1] += f[v][1] + 1;
f[now][2] += f[v][0] + f[v][2];
} else {
ans += 2 * (f[v][0] + 1) * (f[now][0] + 1);
ans += (f[v][1] + f[v][3]) * (f[now][0] + 1);
ans += (f[now][1] + f[now][3]) * (f[v][0] + 1);
f[now][0] += f[v][0] + 1;
f[now][3] += f[v][1] + f[v][3];
}
}
}
int n;
int main() {
freopen("0-1-Tree.in", "r", stdin);
freopen("0-1-Tree.out", "w", stdout);
scanf("%d", &n);
for (int i = 1; i <= n - 1; ++i) {
int u, v, w;
scanf("%d %d %d", &u, &v, &w);
AddEdge(u, v, w);
AddEdge(v, u, w);
}
dfs(1, 0);
printf("%d\n", ans);
return 0;
}