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: detectives_conan

Problemset: อพยพปลอดภัย (Quartet)

Language: cpp

Time: 0.074 second

Submitted On: 2025-05-24 22:57:24

#include <bits/stdc++.h>
#define int long long

using namespace std;

const int mod = 1e9 + 7;
int n, m, u, v;
int sz[200200], deg[200200], ans = 0;
vector<int> vc[200200];

void dfs1(int u, int pa) {
    sz[u] = (u <= n);
    for (int v : vc[u]) {
        if (v == pa) continue;
        dfs1(v, u);
        sz[u] += sz[v];
    }
}

void dfs2(int u, int pa) {
    if(u > n){ 
        vector<int> pref(5, 0), a;
        for (int v : vc[u]) {
            if(sz[v] > sz[u]) a.push_back(n - sz[u]);
            else a.push_back(sz[v]);
        }
        pref[0] = 1;
        for(int x : a){
            for(int i = 4; i >= 1; --i){
                pref[i] = (pref[i] + (pref[i - 1] * x) % mod) % mod;
            }
        }
        ans = (ans + pref[4]) % mod;
    }
    for (int v : vc[u]) {
        if(v == pa) continue;
        dfs2(v, u);
    }
}

int32_t main(){
    cin.tie(nullptr)->sync_with_stdio(false);
    cin >> n >> m;
    for (int i = 1; i <= n + m - 1; ++i) {
        cin >> u >> v;
        vc[u].push_back(v);
        vc[v].push_back(u);
    }
    dfs1(1, -1);
    dfs2(1, -1);
    cout << ans << '\n';
}