C. Kuro and Walking Route | Codeforces Round #482 (Div. 2)

/**
Flowrisa から Beetopiaへのパスの辺を
取り除いたグラフを考えよう。このグラフは少なくとも2つの部分木からなり、
1つはFlowrisaを含み、もうひとつはBeetopiaを含む。
もとのグラフにおいてFlowrisaを含む部分木からBeetopiaを含む部分木
への経路だけが不正な経路なのでそれを全体から除く。
**/

int N, X, Y;
vi G[300005];

// 部分木の頂点数を数える
int dfs(int u, int p, int ng) {
    if (u == ng)RT 0;
    int re = 1;
    each(v, G[u]) if(v!=p){
        int a = dfs(v, u, ng);
        // Flowrisaから見てBeetopiaへのパスだった
        // またはBeetopiaから見てFlowrisaへのパスだった
        if (a == 0 && u != (X^Y^ng)) {
            RT 0;
        }
        re += a;
    }
    RT re;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout << fixed << setprecision(20);

    cin >> N >> X >> Y;
    --X; --Y;
    rep(a, N - 1) {
        int u, v;
        cin >> u >> v;
        --u; --v;
        G[u].push_back(v);
        G[v].push_back(u);
    }

    // Flowrisaを含む部分木の頂点数
    ll xx = dfs(X, -1, Y);
    // Beetopiaを含む部分木の頂点数
    ll yy = dfs(Y, -1, X);
    // (全体)-(Flowrisa->Beetopiaを含む経路)
    ll re = N*(N - 1ll) - xx*yy;
    cout << re << endl;
}