微众银行AK(9月13日)

T1,T2太简单不发了

T3 如果s,t在同一个联通块里那么所有点可以随便建传送阵,否则只能分别在s和t的联通块里各选一点建传送阵

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
#define lowbit(x) x & (-x)
const int N = 1e6 + 10, mod = 1e9 + 7, inf = 1e9;

struct DSU {
    vector<int> fa, sz;
    int n;
    DSU(int n) : fa(n+1), sz(n+1, 1),n(n){ 
        for(int i=0 ; i<=n ; ++i) fa[i] = i;    
    }
    int find(int x) {
        return fa[x]==x?x:fa[x]=find(fa[x]);
    }
    bool same(int x, int y) { return find(x) == find(y); }
    bool merge(int x, int y) {
        x = find(x);
        y = find(y);
        if (x == y) return false;
        sz[x] += sz[y];
        fa[y] = x;
        return true;
    }
};

void solve(){
    int n, m, s, t;
    cin >> n >> m >> s >> t;
    DSU d(n);
    for(int i = 1; i <= m; ++i){
        int u, v;
        cin >> u >> v;
        d.merge(u, v);
    }
    if(d.same(s, t)) cout << (ll)n * (n - 1) / 2 << '\n';
    else{
        int x = 0, y = 0;
        for(int i = 1; i <= n; ++i){
            if(d.same(i, s)) x++;
            if(d.same(i, t)) y++;
        }
        cout << (ll)x * y << '\n';
    }
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int t = 1;
    while(t--){
        solve();
    }
    return 0;
}

#笔试##微众银行#
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-10 14:10
啊啊啊啊好幸福,妈妈是我找工作发疯前的一束光
榕城小榕树:你是我见过最幸福的牛客男孩
点赞 评论 收藏
分享
06-07 19:59
门头沟学院 C++
补药卡我啊😭:都快15年前的了还在11新特性
你的简历改到第几版了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务