记录编号 601105 评测结果 AAAAAAAAAA
题目名称 3127.[codeforces] 0-1-Tree 最终得分 100
用户昵称 GravatarLikableP 是否通过 通过
代码语言 C++ 运行时间 0.472 s
提交时间 2025-06-02 16:03:30 内存使用 5.76 MiB
显示代码纯文本
#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;
}