P8604 [蓝桥杯 2013 国 C] 危险系数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#include<bits/stdc++.h>
using namespace std;
const int N=1e5;
int n,m;
int f[N];
int a[N],b[N];
int u,v;
int res=0;
void init()
{
for(int i=1;i<=n;i++)
f[i]=i;
}
int find(int p)
{
if(f[p]!=p)
return f[p]=find(f[p]);
else
return p;
}
void Union(int x,int y)
{
int rx,ry;
rx=find(x);
ry=find(y);
if(rx!=ry)
f[rx]=ry;
}
bool chick(int p)
{
init();//初始化并查集
for(int i=1;i<=m;i++)
{
if(p==a[i]||p==b[i])
continue;
Union(a[i],b[i]);//删除p节点后,再联结
}
if(find(u)!=find(v))//u,v不在同一集合,说明p是关键点
return true;
else
return false;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);cout.tie(nullptr);
cin>>n>>m;
init();//初始化并查集
for(int i=1;i<=m;i++)
{
cin>>a[i]>>b[i];
Union(a[i],b[i]);
}
cin>>u>>v;
if(find(u)!=find(v))//不在同一父节点下,说明不连通
{
cout<<-1;
return 0;
}
for(int i=1;i<=n;i++)//循环所有点,找关键点的个数
{
if(i!=u&&i!=v)//关键点不能是本身
{
if(chick(i))
res++;
}
}
cout<<res;
return 0;
}