Submission
Status:
(PPPPPPPPPP)(PPPPPPPPPPPP)(PPPPPPx)(PPPP)(PPPPPPP)(PPxSSSS)
Subtask/Task Score:
{4/4}{14/14}{0/12}{7/7}{20/20}{0/43}
Score: 45
User: konthaina_TH
Problemset: อพยพปลอดภัย (Quartet)
Language: cpp
Time: 0.024 second
Submitted On: 2026-09-23 23:41:29
#include <bits/stdc++.h>
using namespace std;
#define int long long
int mod = 1e9+7;
vector<int> graph[100005];
vector<int> edge[100005];
int val[100005];
int n,m;
void dfs(int u,int p) {
if (u <= n) {
val[u] = 1;
}
for (int v : graph[u]) {
if (v == p) continue;
dfs(v,u);
val[u] += val[v];
edge[u].push_back(val[v]);
}
}
void set_val(int u,int p) {
if (u <= n) {
return;
}
for (int v : graph[u]) {
if (v == p or v <= n) continue;
edge[v].push_back(n - val[v]);
set_val(v,u);
}
}
signed main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> n >> m;
for (int i=0;i<n+m-1;i++) {
int u,v;
cin >> u >> v;
graph[u].push_back(v);
graph[v].push_back(u);
}
dfs(n+1,n+1);
set_val(n+1,n+1);
int ans = 0;
for (int i = n+1;i<=n+m;i++) {
if (edge[i].size() < 4) continue;
int dp[5] = {0};
for (int val : edge[i]) {
dp[4] += dp[3] * val;
dp[3] += dp[2] * val;
dp[2] += dp[1] * val;
dp[1] += val;
}
ans += dp[4] % mod;
}
cout << ans % mod << "\n";
return 0;
}