点击跳转例题
题意:
- 共有 n 个点,m 个通道(无向)。
- 给出起点 u ,终点 v。求这两点之间,有多少个点删去后就能使这两点不连通。
- 如果 u 和 v 之间没有路径连通,输出'−1'。
思路:
求解联通块问题,宽搜和并查集,本题用并查集,直接暴力每个点,并查集判断去掉这个点后是否在同一集合即可。
#include <bits/stdc++.h> #define int long long //(有超时风险) #define PII pair<int,int> #define endl '\n' #define LL __int128 using namespace std; const int N=2e5+10,M=1e3+10,mod=998244353,INF=0x3f3f3f3f; int x[N],y[N]; int a[N],b[N],c[N],pre[N]; int p[N],sz[N],d[N]; int find(int x) { if(p[x]!=x) { p[x]=find(p[x]); } return p[x]; } signed main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); int n,m;cin>>n>>m; for(int i=1;i<=m;i++) cin>>x[i]>>y[i]; int st,ed;cin>>st>>ed; for(int i=1;i<=n;i++) p[i]=i; for(int i=1;i<=n;i++) p[find(x[i])]=find(y[i]); if(find(st)!=find(ed)) { cout<<-1<<endl; return 0; } auto check=[&](int mid) { for(int i=1;i<=n;i++) p[i]=i; for(int i=1;i<=m;i++) { if(x[i]==mid||y[i]==mid) continue; p[find(x[i])]=find(y[i]); } return find(st)!=find(ed); }; int ans=0; for(int i=1;i<=n;i++) { if(i!=st&&i!=ed) { if(check(i)) ans++; } } cout<<ans<<endl; return 0; }
P8604 [蓝桥杯 2013 国 C] 危险系数--2024蓝桥杯冲刺省一
最新推荐文章于 2024-10-10 14:15:17 发布