Description

抗日战争时期,冀中平原的地道战曾发挥重要作用。

地道的多个站点间有通道连接,形成了庞大的网络。但也有隐患,当敌人发现了某个站点后,其它站点间可能因此会失去联系。

我们来定义一个危险系数DF(x,y):

对于两个站点x和y (x != y), 如果能找到一个站点z,当z被敌人破坏后,x和y不连通,那么我们称z为关于x,y的关键点。相应的,对于任意一对站点x和y,危险系数DF(x,y)就表示为这两点之间的关键点个数。

本题的任务是:已知网络结构,求两站点之间的危险系数。

Input

输入数据第一行包含2个整数n(2 <= n <= 1000), m(0 <= m <= 2000),分别代表站点数,通道数;

接下来m行,每行两个整数 u,v (1 <= u, v <= n; u != v)代表一条通道;

最后1行,两个数u,v,代表询问两点之间的危险系数DF(u, v)。

Output

一个整数,如果询问的两点不连通则输出-1.

Sample Input

7 6
1 3
2 3
3 4
3 5
4 5
5 6
1 6

Sample Output

2

Source

蓝桥杯
 
解法1:DFS
求关于两个点的割点
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 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或者并查集求无向图关于两点的割点个数)的更多相关文章

  1. Java实现 蓝桥杯 历届试题 危险系数

    问题描述 抗日战争时期,冀中平原的地道战曾发挥重要作用. 地道的多个站点间有通道连接,形成了庞大的网络.但也有隐患,当敌人发现了某个站点后,其它站点间可能因此会失去联系. 我们来定义一个危险系数DF( ...

  2. 蓝桥杯  历届试题 幸运数  dfs

    历届试题 幸运数 时间限制:1.0s   内存限制:256.0MB 问题描述 幸运数是波兰数学家乌拉姆命名的.它采用与生成素数类似的"筛法"生成 . 首先从1开始写出自然数1,2, ...

  3. 蓝桥杯  历届试题 剪格子  dfs

    历届试题 剪格子 时间限制:1.0s   内存限制:256.0MB 问题描述 如下图所示,3 x 3 的格子中填写了一些整数. +--*--+--+ |10* 1|52| +--****--+ |20 ...

  4. 历届试题 危险系数-(dfs+记录路径)

     历届试题 危险系数   问题描述 抗日战争时期,冀中平原的地道战曾发挥重要作用. 地道的多个站点间有通道连接,形成了庞大的网络.但也有隐患,当敌人发现了某个站点后,其它站点间可能因此会失去联系. 我 ...

  5. 蓝桥杯历届试题 地宫取宝 dp or 记忆化搜索

    问题描述 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角,出口在右下角. 小明被带到地宫的入口,国王要求他只能向右或向下行走. 走 ...

  6. 蓝桥杯 历届试题 剪格子(dfs搜索)

    历届试题 剪格子 时间限制:1.0s   内存限制:256.0MB 问题描述 如下图所示,3 x 3 的格子中填写了一些整数. +--*--+--+ |* || +--****--+ ||* | ** ...

  7. 蓝桥杯 历届试题 网络寻路(dfs搜索合法路径计数)

    X 国的一个网络使用若干条线路连接若干个节点.节点间的通信是双向的.某重要数据包,为了安全起见,必须恰好被转发两次到达目的地.该包可能在任意一个节点产生,我们需要知道该网络中一共有多少种不同的转发路径 ...

  8. 蓝桥杯 历届试题 约数倍数选卡片 (经典数论+DFS)

    闲暇时,福尔摩斯和华生玩一个游戏: 在N张卡片上写有N个整数.两人轮流拿走一张卡片.要求下一个人拿的数字一定是前一个人拿的数字的约数或倍数.例如,某次福尔摩斯拿走的卡片上写着数字“6”,则接下来华生可 ...

  9. 蓝桥杯-历届试题 剪格子(dfs)

    历届试题 剪格子   时间限制:1.0s   内存限制:256.0MB        问题描述 如下图所示,3 x 3 的格子中填写了一些整数. +--*--+--+|10* 1|52|+--**** ...

随机推荐

  1. 如何启动一个Vue2.x项目

    1. cd到工作目录2. npm init -y3. 先查看有没有安装全局的vue-cli,:vue-V,没有的话安装一下:npm install vue-cli4. 创建项目: vue init w ...

  2. Code Signal_练习题_Knapsack Light

    You found two items in a treasure chest! The first item weighs weight1 and is worth value1, and the ...

  3. CSS3多媒体查询

    CSS2多媒体查询: @media规则在css2中有介绍,针对不同媒体类型(包括显示器,便携设备,电视机,等等)可以定制不同的样式规则. CSS3多媒体查询: CSS3多媒体查询继承了CSS2多媒体类 ...

  4. WOSA/XFS PTR Form解析库—FormRule.h

    #ifndef _FORMRULE_H_#define _FORMRULE_H_ #include <XFSPTR.H>#include <string>#include &l ...

  5. Asp.net MVC检测到有潜在危险的 Request.Form 值

    解决方法很简单,不像网上说的那么麻烦.只需一步: [ValidateInput(false)] public ActionResult Test(){ }

  6. SQL 中常用存储过程xp_cmdshell运行cmd命令 (转载)

    目的:使用SQL语句,在D盘创建一个文件夹myfile 首先查询系统配置 SELECT * FROM sys.configurations WHERE name='xp_cmdshell' OR na ...

  7. MySQL binlog group commit--commit stage

    说明: 1.process_commit_stage_queue:调用调用ha_commit_low->innobase_commit进入innodb层依次提交 2. process_after ...

  8. Linux内核参数基础优化

    web 服务负载均衡器常规网站服务器优化的基本配置: net.ipv4.tcp_fin_timeout =2 net.ipv4.tcp_tw_reuse =1 net.ipv4.tcp_tw_recy ...

  9. October 24th, 2017 Week 43rd Tuesday

    We can't give up trying. The fight was worth it. 我们不能放弃尝试,奋斗是值得的. When doing researches in some cutt ...

  10. Redis-安装时问题整理

    一.Redis编译: 1.问题:make gcc error yum –y install gcc 2.问题:安装报错 error: jemalloc/jemalloc.h: No such file ...