#include <bits/stdc++.h>
using namespace std;
const long long mod = 1000000007;
int main() {
long long N, D; cin >> N >> D;
vector<vector<long long>> adj(N+1); // occhio 1-based
for (long long i = 0; i < N-1; i++) {
long long u, v; cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
vector<long long> nl(N+1, 0); // count number of loosing from there
function<void(long long,long long)> dfs = [&](long long a, long long p) {
for (long long x : adj[a]) {
if (x == p) continue;
dfs(x, a);
if (nl[x] == 0) nl[a]++;
}
};
vector<long long> w(N+1, 0); // is this a winning root?
function<void(long long,long long)> decroot = [&](long long a, long long p) {
if (w[p] == 0) nl[a]++;
else if (nl[a] == 0 && nl[p] == 1) nl[a]++;
if (nl[a] > 0) w[a] = 1;
for (long long x : adj[a]) {
if (x == p) continue;
decroot(x, a);
}
};
long long swappable = 0;
function<void(long long, long long)> cswap = [&](long long a, long long p) {
if (nl[a] > 1) return;
if (nl[a] == 0) {
swappable++;
for (long long x : adj[a]) {
if (x == p) continue;
cswap(x, a);
}
}
else {
for (long long x : adj[a]) {
if (x == p || nl[x] > 0) continue;
cswap(x, a);
}
}
};
dfs(1, 0);
long long ln = 0;
for (long long i = 1; i <= N; i++) ln += ((nl[i] == 0) ? 1 : 0);
long long wn = N-ln;
cswap(1, 0);
w[1] = nl[1] > 0;
for (long long x : adj[1]) decroot(x, 1);
long long wr = 0;
for (long long i = 1; i <= N; i++) wr += (w[i] ? 1 : 0);
long long tot = 0;
if (w[1]) { // non cambio nulla
tot += wn*N;
tot += (ln-swappable)*N;
tot += swappable*wr;
} else {
tot += swappable*(N-wr);
}
cout << tot%mod << "\n";
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |