X星系的的防卫体系包含 n 个空间站。这 n 个空间站间有 m 条通信链路,构成通信网。
两个空间站间可能直接通信,也可能通过其它空间站中转。
对于两个站点x和y (x != y), 如果能找到一个站点z,使得:
当z被破坏后,x和y不连通,则称z为关于x,y的关键站点。
显然,对于给定的两个站点,关于它们的关键点的个数越多,通信风险越大。
你的任务是:已经网络结构,求两站点之间的通信风险度,即:它们之间的关键点的个数。
输入数据第一行包含2个整数n(2 <= n <= 1000), m(0 <= m <= 2000),分别代表站点数,链路数。
空间站的编号从1到n。通信链路用其两端的站点编号表示。
接下来m行,每行两个整数 u,v (1 <= u, v <= n; u != v)代表一条链路。
最后1行,两个数u,v,代表被询问通信风险度的两个站点。
输出:一个整数,如果询问的两点不连通则输出-1.
例如:
用户输入:
7 6
1 3
2 3
3 4
3 5
4 5
5 6
1 6
则程序应该输出:
2
#include<iostream>
#include<cstring>
using namespace std;
int father[2000];
struct d{
int x;
int y;
}e[2000+10];
int find(int n)
{
if(father[n]==-1)
return n;
else{
return find(father[n]);
}
}//并查集模板
int un(int a,int b)
{
a=find(a);
b=find(b);
if(a==b)
return false;
if(a>b)
{
father[b]=a;
}else{
father[a]=b;
}
return true;
}
int main()
{
int n,m;
int u,v;
cin>>n>>m;
for(int i=0;i<m;i++)
{
cin>>e[i].x;
cin>>e[i].y;
}
cin>>u>>v;
int ans=0;
for(int i=1;i<=n;i++)//遍历每一个去除的点
{
if(i==u||i==v) continue;
memset(father,-1,sizeof(father));
for(int j=0;j<m;j++)
{
if(e[j].x!=i&&e[j].y!=i)
{
un(e[j].x,e[j].y);
}
}
if(find(u)!=find(v))
ans++;
}
cout<<ans;
return 0;
}