I-马拉松_河南萌新联赛2024第(四)场:河南理工大学 (nowcoder.com)
不理解代码,直接画一个树的图就OK了。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
typedef long double ldb;
typedef pair<int, int> pii;
typedef pair<ll, ll> PII;
#define pb emplace_back
//#define int ll
#define all(a) a.begin(),a.end()
#define ps push_back
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define lc u << 1
#define rc u << 1 | 1
void solve();
const int N = 1e6 + 10;
signed main() {
IOS;
ll t = 1;
// cin >> t;
while (t--)
solve();
return 0;
}
vector<vector<ll>> mp(N);
vector<ll> a(N),size1(N);
ll x, y;
void dfs(ll u, ll fa)
{
a[u] = (u==y);
size1[u] = 1;
for(auto i : mp[u])
{
if(fa == i) continue;
dfs(i, u);
size1[u] = size1[u] + size1[i];//根结点的数量
a[u] = a[u] | a[i];
}
}
void solve() {
ll n; cin >> n >> x >> y;
for(int i = 1; i <= n - 1; ++ i)
{
ll u, v; cin >> u >> v;
mp[u].pb(v);
mp[v].pb(u);
}
dfs(x,0);
for(auto it : mp[x])
if(a[it]) cout << (n - size1[it])*size1[y] << endl;
}