1+ package class183 ;
2+
3+ // 聪聪可可,C++版
4+ // 一共有n个节点,给定n-1条边,每条边有边权,所有节点组成一棵树
5+ // 如果点对(u, v)的简单路径权值和能被3整除,则称这个点对是合法的
6+ // 认为点对(x, x)的简单路径权值和是0,并且认为(x, y)和(y, x)是不同的点对
7+ // 打印(合法点对的数量 / 点对的总数量)的最简分数形式
8+ // 1 <= n、边权 <= 2 * 10^4
9+ // 测试链接 : https://www.luogu.com.cn/problem/P2634
10+ // 如下实现是C++的版本,C++版本和java版本逻辑完全一样
11+ // 提交如下代码,可以通过所有测试用例
12+
13+ //#include <bits/stdc++.h>
14+ //
15+ //using namespace std;
16+ //
17+ //const int MAXN = 20001;
18+ //int n;
19+ //
20+ //int head[MAXN];
21+ //int nxt[MAXN << 1];
22+ //int to[MAXN << 1];
23+ //int weight[MAXN << 1];
24+ //int cntg;
25+ //
26+ //bool vis[MAXN];
27+ //int siz[MAXN];
28+ //
29+ //int cur[3];
30+ //int all[3];
31+ //
32+ //int gcd(int a, int b) {
33+ // return b == 0 ? a : gcd(b, a % b);
34+ //}
35+ //
36+ //void addEdge(int u, int v, int w) {
37+ // nxt[++cntg] = head[u];
38+ // to[cntg] = v;
39+ // weight[cntg] = w;
40+ // head[u] = cntg;
41+ //}
42+ //
43+ //int getSize(int u, int fa) {
44+ // siz[u] = 1;
45+ // for (int e = head[u]; e > 0; e = nxt[e]) {
46+ // int v = to[e];
47+ // if (v != fa && !vis[v]) {
48+ // siz[u] += getSize(v, u);
49+ // }
50+ // }
51+ // return siz[u];
52+ //}
53+ //
54+ //int getCentroid(int u, int fa) {
55+ // int half = getSize(u, fa) >> 1;
56+ // bool find = false;
57+ // while (!find) {
58+ // find = true;
59+ // for (int e = head[u]; e > 0; e = nxt[e]) {
60+ // int v = to[e];
61+ // if (v != fa && !vis[v] && siz[v] > half) {
62+ // fa = u;
63+ // u = v;
64+ // find = false;
65+ // break;
66+ // }
67+ // }
68+ // }
69+ // return u;
70+ //}
71+ //
72+ //void dfs(int u, int fa, int dis) {
73+ // cur[dis % 3]++;
74+ // for (int e = head[u]; e > 0; e = nxt[e]) {
75+ // int v = to[e];
76+ // if (v != fa && !vis[v]) {
77+ // dfs(v, u, dis + weight[e]);
78+ // }
79+ // }
80+ //}
81+ //
82+ //int calc(int u) {
83+ // int ans = 0;
84+ // all[0] = all[1] = all[2] = 0;
85+ // for (int e = head[u]; e > 0; e = nxt[e]) {
86+ // int v = to[e];
87+ // int w = weight[e];
88+ // if (!vis[v]) {
89+ // cur[0] = cur[1] = cur[2] = 0;
90+ // dfs(v, u, w);
91+ // ans += all[0] * cur[0] * 2 + all[1] * cur[2] * 2 + all[2] * cur[1] * 2 + cur[0] * 2;
92+ // all[0] += cur[0];
93+ // all[1] += cur[1];
94+ // all[2] += cur[2];
95+ // }
96+ // }
97+ // return ans;
98+ //}
99+ //
100+ //int solve(int u) {
101+ // vis[u] = true;
102+ // int ans = calc(u);
103+ // for (int e = head[u]; e > 0; e = nxt[e]) {
104+ // int v = to[e];
105+ // if (!vis[v]) {
106+ // ans += solve(getCentroid(v, u));
107+ // }
108+ // }
109+ // return ans;
110+ //}
111+ //
112+ //int main() {
113+ // ios::sync_with_stdio(false);
114+ // cin.tie(nullptr);
115+ // cin >> n;
116+ // for (int i = 1, u, v, w; i < n; i++) {
117+ // cin >> u >> v >> w;
118+ // addEdge(u, v, w);
119+ // addEdge(v, u, w);
120+ // }
121+ // int a = solve(getCentroid(1, 0)) + n;
122+ // int b = n * n;
123+ // int c = gcd(a, b);
124+ // a /= c;
125+ // b /= c;
126+ // cout << a << "/" << b << '\n';
127+ // return 0;
128+ //}
0 commit comments