| 174 | } |
| 175 | |
| 176 | public static void dfsLeft(int u, int fa, int red, int black, long path) { |
| 177 | if (u <= n) { |
| 178 | redKey[++cnta] = 2 * red - black; |
| 179 | redPath[cnta] = path; |
| 180 | blackKey[cnta] = 2 * black - red; |
| 181 | blackPath[cnta] = path; |
| 182 | } |
| 183 | for (int e = head2[u]; e > 0; e = next2[e]) { |
| 184 | int v = to2[e]; |
| 185 | if (v != fa && !vis[e >> 1]) { |
| 186 | int nextRed = red + (color2[e] == 0 ? 1 : 0); |
| 187 | int nextBlack = black + (color2[e] == 1 ? 1 : 0); |
| 188 | dfsLeft(v, u, nextRed, nextBlack, path * weight2[e] % MOD); |
| 189 | } |
| 190 | } |
| 191 | } |
| 192 | |
| 193 | public static void dfsRight(int u, int fa, int red, int black, long path) { |
| 194 | if (u <= n) { |