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;
}
#笔试##微众银行#