P8604 [蓝桥杯 2013 国 C] 危险系数

题目背景

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

题目描述

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

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

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

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

输入格式

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

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

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

输出格式

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

输入输出样例

输入

复制代码
7 6
1 3
2 3
3 4
3 5
4 5
5 6
1 6

输出

复制代码
2

说明/提示

时限 1 秒, 64M。蓝桥杯 2013 年第四届国赛

解题思路

暴搜,我们可以求出所有的路径,并标记所有路径中的点,当某个点被标记的数量等于总路径数量时,这个点就为关键点

代码实现

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
const int N=1010;
vector<int>s[N];
int f[N][N],mid[N];
bool st[N];
int x,y,k=-1,d;

void dfs(int t){
	if(t==y){
		if(k==-1)k=0;
		k++;
		for(int i=1;i<=d;i++)if(st[i])mid[i]++;
		return;
	}
	st[t]=true;     //把走过的点都标记一下,防止重复走同一个点 
	for(int i=0;i<s[t].size();i++){
		if(st[s[t][i]])continue;      //被标记,代表已经被走过了,直接跳过 
		dfs(s[t][i]);     //递归到下一层 
	}
	st[t]=false;   //回溯 
}


int main(){
	int n,m;
	cin>>n>>m;
	while(m--){
		int a,b; 
		cin>>a>>b;
		s[a].push_back(b);    //因为地道是双向的,所以要存两边 
		s[b].push_back(a);
		d=max(d,max(a,b));	  //求出最大的点,确定最后求答案时的范围 
	}
	cin>>x>>y;
	dfs(x);
	int ans=0;
	for(int i=1;i<=d;i++)if(mid[i]==k)ans++;
	cout<<ans-1<<endl;    //最终答案要减去出发点 
	return 0;
}
相关推荐
山里灵活的狗_18 小时前
蓝桥杯练习笔记(二十-日期问题)
笔记·职场和发展·蓝桥杯
超栈18 小时前
蓝桥杯-网络安全比赛题目-遗漏的压缩包
前端·网络·sql·安全·web安全·职场和发展·蓝桥杯
£suPerpanda1 天前
蓝桥杯第21场小白入门赛补题
数据结构·c++·算法·蓝桥杯
安祝老师1 天前
十四届蓝桥杯STEMA考试Python真题试卷第二套第二题
开发语言·python·算法·青少年编程·蓝桥杯
白榆maple2 天前
(蓝桥杯C/C++)——基础算法(上)
c语言·c++·算法·蓝桥杯
混迹网络的权某2 天前
蓝桥杯真题——三角回文数(C语言)
c语言·开发语言·算法·蓝桥杯·改行学it
混迹网络的权某2 天前
蓝桥杯真题——乐乐的序列和(C语言)
c语言·算法·蓝桥杯
aqua35357423582 天前
杨辉三角——c语言
java·c语言·数据结构·算法·蓝桥杯
Aurora_th2 天前
蓝桥杯 Python组-神奇闹钟(datetime库)
python·算法·职场和发展·蓝桥杯·datetime
CocowhoLynn2 天前
P10424 [蓝桥杯 2024 省 B] 好数 题解
职场和发展·蓝桥杯