您的位置:首页 > 理论基础 > 数据结构算法

蓝桥杯-风险度量-并查集

2018-02-13 18:58 176 查看
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>

using namespace std;

int route[2000][2], fa[1000];    //route[]数组记录所有链路信息
int N, M;

void init()
{
for (int i = 1; i <= N; i++)
fa[i] = i;
}

int find(int x)
{
if (x != fa[x])
{
fa[x] = find(fa[x]);
}
return fa[x];
}
void Union(int x, int y)
{
int fx = find(x), fy = find(y);
if (fx != fy) fa[fx] = fy;
}
int main()
{
cin >> N >> M;
init();
for (int i = 0; i < M; i++)
{
cin >> route[i][0] >> route[i][1];
Union(route[i][0], route[i][1]);
}
int a, b, pa, pb;
cin >> a >> b;
pa = find(a); pb = find(b);
if (pa != pb)    
{//不连通则退出
cout << -1 << endl;
}
else
{
int count = 0;
for (int i = 1; i <= N; i++)
{//枚举所有a,b以外的点
if (i == a || i == b)	continue;
init();
for (int j = 0; j < M; j++)
{
if (route[j][0] == i || route[j][1] == i) continue;    //去掉与当前枚举点i相关联的链路
Union(route[j][0], route[j][1]);
}
pa = find(a); pb = find(b);
if (pa != pb) count++; //不再连通,则i为关键点,计数加一
}
cout << count << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构