Submission
Status:
(PPPPPPPPPP)(PPPPPPPPPPPP)(PPPPPPP)(PPPP)(PPPPPPP)(PPPPPPP)
Subtask/Task Score:
{4/4}{14/14}{12/12}{7/7}{20/20}{43/43}
Score: 100
User: navysrimuang
Problemset: อพยพปลอดภัย (Quartet)
Language: cpp
Time: 0.078 second
Submitted On: 2026-04-23 17:45:51
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const ll MOD = 1e9+7;
#define int long long
int n,m;
vector<vector<pair<int,int>>> adj;
vector<int> sub;
void dfs(int u, int p){
sub[u] = (u <= n ? 1 : 0);
for(auto [t,v] : adj[u]){
if(v == p) continue;
dfs(v,u);
sub[u] += sub[v];
}
}
int32_t main(){
cin.tie(0)->sync_with_stdio(0);
cin >> n >> m;
adj.resize(n+m+1);
sub.resize(n+m+1,0);
for(int i = 0;i<n+m-1;i++){
int a,b;
cin >> a >> b;
if(i < n){
adj[a].push_back({0,b});
adj[b].push_back({0,a});
}else{
adj[a].push_back({1,b});
adj[b].push_back({1,a});
}
}
dfs(1,0);
ll sum = 0;
for(int i = n+1;i<=n+m;i++){
if(adj[i].size() >= 4){
vector<int> p;
for(auto[t,x] : adj[i]){
p.push_back((sub[x] > sub[i] ? (n-sub[i]) : sub[x]));
}
int k = p.size();
// cout << "\n";
// for(int x : p) cout << x << " ";
// cout << "\n";
vector<vector<int>> dp(k+2, vector<int>(4,0));
for(int l = 0;l<4;l++){
for(int j = 1;j<=k;j++){
if(l) dp[j][l] = dp[j-1][l-1]*p[j-1];
else dp[j][l] = p[j-1];
dp[j][l] += dp[j-1][l];
// cout << dp[l][j] << " ";
}
// cout << "\n";
}
sum += dp[k][3];
sum %= MOD;
}
}
cout << sum << "\n";
// for(int i = 1;i<=n+m;i++) cout << sub[i] << " ";
return 0;
}