蓝桥杯历届试题 危险系数(dfs或者并查集求无向图关于两点的割点个数)
Description
地道的多个站点间有通道连接,形成了庞大的网络。但也有隐患,当敌人发现了某个站点后,其它站点间可能因此会失去联系。
我们来定义一个危险系数DF(x,y):
对于两个站点x和y (x != y), 如果能找到一个站点z,当z被敌人破坏后,x和y不连通,那么我们称z为关于x,y的关键点。相应的,对于任意一对站点x和y,危险系数DF(x,y)就表示为这两点之间的关键点个数。
本题的任务是:已知网络结构,求两站点之间的危险系数。
Input
接下来m行,每行两个整数 u,v (1 <= u, v <= n; u != v)代表一条通道;
最后1行,两个数u,v,代表询问两点之间的危险系数DF(u, v)。
Output
Sample Input
7 6
1 3
2 3
3 4
3 5
4 5
5 6
1 6
Sample Output
2
Source
dfs爆搜,找到这两点间的所有路径数目ans,如果在1这些路径中,某些点出现的次数是ans
那么该点一定是关于目标两点的割点
搜索路径,记录路径中每个结点的出现次数,最后与可行路径数比较
边搜边记录其路径,搜到终点之后,将记录的路径的结点出现次数加1
如果在全部搜索完之后,有点在所有可行路径中出现的次数等于可行路径数,那么该点是关于起点和终点和割点
#include<stdio.h>
#include<iostream>
#include<math.h>
#include<string.h>
#include<set>
#include<map>
#include<list>
#include<queue>
#include<algorithm>
using namespace std;
typedef long long LL;
int mon1[]= {,,,,,,,,,,,,};
int mon2[]= {,,,,,,,,,,,,};
int dir[][]= {{,},{,-},{,},{-,}}; int getval()
{
int ret();
char c;
while((c=getchar())==' '||c=='\n'||c=='\r');
ret=c-'';
while((c=getchar())!=' '&&c!='\n'&&c!='\r')
ret=ret*+c-'';
return ret;
} #define max_v 1005
int vis[max_v];
int cnt[max_v];
int path[max_v];
int G[max_v][max_v];
int n,m;
int ans;
int s,f; void init()
{
memset(vis,,sizeof(vis));
memset(cnt,,sizeof(cnt));
memset(path,,sizeof(path));
memset(G,,sizeof(G));
ans=;
}
void dfs(int cur,int len)
{
if(cur==f)
{
ans++;
for(int i=;i<len;i++)
cnt[path[i]]++;
return ;
}
for(int i=;i<=n;i++)
{
if(G[cur][i]&&vis[i]==)
{
vis[i]=;
path[len]=i; dfs(i,len+); vis[i]=;
}
}
}
int main()
{
int x,y;
scanf("%d %d",&n,&m);
init();
for(int i=;i<=m;i++)
{
scanf("%d %d",&x,&y);
G[x][y]=G[y][x]=;
}
scanf("%d %d",&s,&f); vis[s]=;
path[]=s; dfs(s,); if(ans==)
{
printf("-1\n");
return ;
}
int sum=;
for(int i=;i<=n;i++)
if(cnt[i]==ans)
sum++;
printf("%d\n",sum-);
return ;
}
/*
求关于两个点的割点
dfs爆搜,找到这两点间的所有路径数目ans,如果在1这些路径中,某些点出现的次数是ans
那么该点一定是关于目标两点的割点 具体做法:
搜索路径,记录路径中每个结点的出现次数,最后与可行路径数比较 将目标两点设置为起点s和终点f,dfs爆搜其路径
边搜边记录其路径,搜到终点之后,将记录的路径的结点出现次数加1
如果在全部搜索完之后,有点在所有可行路径中出现的次数等于可行路径数,那么该点是关于起点和终点和割点 */
解法二:并查集
无向图求关于某两点的割点个数
遍历每个点,进行多次并查集操作,如果去除和某个点有关的所有边
导致起点和终点不能连通,那么该点属于关于这两点的割点
该方法属于暴力法
#include<stdio.h>
#include<iostream>
#include<math.h>
#include<string.h>
#include<set>
#include<map>
#include<list>
#include<queue>
#include<algorithm>
using namespace std;
typedef long long LL;
int mon1[]= {,,,,,,,,,,,,};
int mon2[]= {,,,,,,,,,,,,};
int dir[][]= {{,},{,-},{,},{-,}}; int getval()
{
int ret();
char c;
while((c=getchar())==' '||c=='\n'||c=='\r');
ret=c-'';
while((c=getchar())!=' '&&c!='\n'&&c!='\r')
ret=ret*+c-'';
return ret;
} #define max_v 1005
int pa[max_v];
int n,m;
int a[max_v],b[max_v];
int s,f;
void init()
{
for(int i=;i<=n;i++)
pa[i]=i;
}
int find_set(int x)
{
if(x!=pa[x])
pa[x]=find_set(pa[x]);
return pa[x];
}
void union_set(int x,int y)
{
x=find_set(x);
y=find_set(y);
if(x==y)
return ;
pa[x]=y;
}
int fun(int v)
{
init();
for(int i=;i<=m;i++)
{
if(a[i]==v||b[i]==v)
continue;
union_set(a[i],b[i]);
}
if(find_set(s)!=find_set(f))
return ;
else
return ;
}
int main()
{
int x,y;
scanf("%d %d",&n,&m);
for(int i=;i<=m;i++)
{
scanf("%d %d",&x,&y);
a[i]=x;
b[i]=y;
}
scanf("%d %d",&s,&f);
int sum=;
for(int i=;i<=n;i++)
{
if(i==s||i==f)
continue;
if(fun(i)==)
sum++;
}
printf("%d\n",sum);
return ;
}
/*
无向图求关于某两点的割点个数
遍历每个点,进行多次并查集操作,如果去除和某个点有关的所有边
导致起点和终点不能连通,那么该点属于关于这两点的割点
该方法属于暴力法
*/
蓝桥杯历届试题 危险系数(dfs或者并查集求无向图关于两点的割点个数)的更多相关文章
- Java实现 蓝桥杯 历届试题 危险系数
问题描述 抗日战争时期,冀中平原的地道战曾发挥重要作用. 地道的多个站点间有通道连接,形成了庞大的网络.但也有隐患,当敌人发现了某个站点后,其它站点间可能因此会失去联系. 我们来定义一个危险系数DF( ...
- 蓝桥杯 历届试题 幸运数 dfs
历届试题 幸运数 时间限制:1.0s 内存限制:256.0MB 问题描述 幸运数是波兰数学家乌拉姆命名的.它采用与生成素数类似的"筛法"生成 . 首先从1开始写出自然数1,2, ...
- 蓝桥杯 历届试题 剪格子 dfs
历届试题 剪格子 时间限制:1.0s 内存限制:256.0MB 问题描述 如下图所示,3 x 3 的格子中填写了一些整数. +--*--+--+ |10* 1|52| +--****--+ |20 ...
- 历届试题 危险系数-(dfs+记录路径)
历届试题 危险系数 问题描述 抗日战争时期,冀中平原的地道战曾发挥重要作用. 地道的多个站点间有通道连接,形成了庞大的网络.但也有隐患,当敌人发现了某个站点后,其它站点间可能因此会失去联系. 我 ...
- 蓝桥杯历届试题 地宫取宝 dp or 记忆化搜索
问题描述 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角,出口在右下角. 小明被带到地宫的入口,国王要求他只能向右或向下行走. 走 ...
- 蓝桥杯 历届试题 剪格子(dfs搜索)
历届试题 剪格子 时间限制:1.0s 内存限制:256.0MB 问题描述 如下图所示,3 x 3 的格子中填写了一些整数. +--*--+--+ |* || +--****--+ ||* | ** ...
- 蓝桥杯 历届试题 网络寻路(dfs搜索合法路径计数)
X 国的一个网络使用若干条线路连接若干个节点.节点间的通信是双向的.某重要数据包,为了安全起见,必须恰好被转发两次到达目的地.该包可能在任意一个节点产生,我们需要知道该网络中一共有多少种不同的转发路径 ...
- 蓝桥杯 历届试题 约数倍数选卡片 (经典数论+DFS)
闲暇时,福尔摩斯和华生玩一个游戏: 在N张卡片上写有N个整数.两人轮流拿走一张卡片.要求下一个人拿的数字一定是前一个人拿的数字的约数或倍数.例如,某次福尔摩斯拿走的卡片上写着数字“6”,则接下来华生可 ...
- 蓝桥杯-历届试题 剪格子(dfs)
历届试题 剪格子 时间限制:1.0s 内存限制:256.0MB 问题描述 如下图所示,3 x 3 的格子中填写了一些整数. +--*--+--+|10* 1|52|+--**** ...
随机推荐
- cf113D. Museum(期望 高斯消元)
题意 题目链接 Sol 设\(f[i][j]\)表示Petya在\(i\),\(Vasya\)在\(j\)的概率,我们要求的是\(f[i][i]\) 直接列方程高斯消元即可,由于每个状态有两维,因此时 ...
- VMware虚拟机安装黑苹果MacOS Mojave系统详细教程
更多资源请百度搜索:前端资源网 欢迎关注我的博客:www.w3h5.com 最近遇到一个H5页面的 iPhone X 刘海兼容问题.查到一个 XCode 编辑器,可以模拟 iPhone X 环境运行. ...
- SSM框架下的redis缓存
基本SSM框架搭建:http://www.cnblogs.com/fuchuanzhipan1209/p/6274358.html 配置文件部分: 第一步:加入jar包 pom.xml <!-- ...
- 正则匹配身份证有bug你知道么?
在开发中,我们需要验证用户的输入信息,多半采用正则验证,下面就是身份证证号的几种常用的正则表达式: var reg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x) ...
- php 去除所有空格 包括中文空格圆角空格
有的中文的半角,圆角空格或者段落符显示为空白的.可以用正则来处理 preg_replace("/(\s|\ \;| |\xc2\xa0)/","" ...
- tilestache + mbutil应用
1. 安装pip. 我们同样需要在Python的官网上去下载,下载地址是: https://pypi.python.org/pypi/pip#downloads 2. 解压. 解压pip-9.0.1. ...
- TreeView失去焦点时亮显选中状态
Windows Form下设置属性即可. TreeView.HideSelection = false
- 【Python】keras卷积神经网络识别mnist
卷积神经网络的结构我随意设了一个. 结构大概是下面这个样子: 代码如下: import numpy as np from keras.preprocessing import image from k ...
- LeetCode 题解之Most Common Word
1.题目描述 2.题目分析 首先将输入句子拆分成单词,在这个过程中将所有大写字母变换成小写字母,将每一个单词作为一个字符串放入一个 map<string,int> 容器中,最后遍历容器,查 ...
- C# 实例化的执行顺序(转)
首先进行细分1.类的成员分为:字段,属性,方法,构造函数2.成员修饰符:静态成员,实例成员不考虑继承的关系执行顺序为:1.静态字段2.静态构造方法3.实例字段4.实例构造方法其中 属性和方法只有在调用 ...