Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- const int ms = 1e5 + 20;
- const int mx = 5;
- const ll mod = 1e9 + 7;
- vector<pair<int, int>> adj[ms];
- ll dp[ms][mx];
- ll dfs(int u, int p, int ci) {
- ll &ans = dp[u][ci];
- if (ans != -1) return ans;
- bool mk[mx] = {0};
- if (u != 0) mk[ci] = 1;
- ans = 1;
- vector<int> vs, cs;
- for (auto e : adj[u]) {
- int v, c;
- tie(v, c) = e;
- if (v == p) continue;
- if (c == -1) {
- vs.push_back(v);
- } else {
- if (mk[c]) {
- return ans = 0;
- }
- mk[c] = 1;
- ans = ans * dfs(v, u, c) % mod;
- }
- }
- for (int i = 0; i < mx; i++) {
- if (!mk[i]) cs.push_back(i);
- }
- if (cs.size() < vs.size()) return ans = 0;
- ll lsc = -1, tt = 0;
- do {
- ll cur = 1, cur_c = 0;
- for (int i = 0; i < vs.size(); i++) {
- cur = cur * dfs(vs[i], u, cs[i]) % mod;
- cur_c *= mx;
- cur_c += cs[i];
- }
- if (cur_c != lsc) {
- tt += cur;
- if (tt >= mod) tt -= mod;
- }
- lsc = cur_c;
- } while(next_permutation(cs.begin(), cs.end()));
- ans = ans * tt % mod;
- return ans;
- }
- int main() {
- int n;
- cin >> n;
- for (int i = 1; i < n; i++) {
- int u, v, c;
- scanf("%d %d %d", &u, &v, &c);
- u--;
- v--;
- c--;
- adj[u].emplace_back(v, c);
- adj[v].emplace_back(u, c);
- }
- memset(dp, -1, sizeof dp);
- cout << dfs(0, 0, 0) << endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement