You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
57 lines
1.1 KiB
C++
57 lines
1.1 KiB
C++
#include <bits/stdc++.h>
|
|
|
|
using namespace std;
|
|
const int N = 2e5 + 5;
|
|
const long long mod = 1e9 + 7;
|
|
int adj[N], nxt[N], to[N], col[N], ecnt;
|
|
|
|
inline void addEdge(int f, int t, int c) {
|
|
ecnt++;
|
|
nxt[ecnt] = adj[f];
|
|
adj[f] = ecnt;
|
|
to[ecnt] = t;
|
|
col[ecnt] = c;
|
|
}
|
|
|
|
using ll=long long;
|
|
|
|
ll qpow(ll a, ll b) {
|
|
ll ans = 1;
|
|
for (; b; b >>= 1, a = a * a % mod)
|
|
if (b & 1)
|
|
ans = ans * a % mod;
|
|
return ans;
|
|
}
|
|
|
|
bool vis[N];
|
|
long long m;
|
|
|
|
void dfs(int x) {
|
|
vis[x] = true;
|
|
for (int e = adj[x]; e; e = nxt[e])
|
|
if (col[e] == 0 && !vis[to[e]])
|
|
m++, dfs(to[e]);
|
|
}
|
|
|
|
int main() {
|
|
long long n, k;
|
|
scanf("%lld%lld", &n, &k);
|
|
for (int i = 1, u, v, w; i < n; i++) {
|
|
scanf("%d%d%d", &u, &v, &w);
|
|
addEdge(u, v, w);
|
|
addEdge(v, u, w);
|
|
}
|
|
|
|
long long ans = qpow(n, k);
|
|
for (int i = 1; i <= n; i++) {
|
|
if (!vis[i]) {
|
|
vis[i] = true;
|
|
m = 1;
|
|
dfs(i);
|
|
ans = (ans - qpow(m, k) + mod) % mod;
|
|
}
|
|
}
|
|
|
|
printf("%lld\n", ans);
|
|
return 0;
|
|
} |