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−1。

输入输出样例

输入

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

输出

复制代码
2

说明/提示

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

我们考虑找出所有的路线,如果一个点是关键点,则此点绝对会出现在每一条路线中,故我们在dfs的过程中记录下每个点被走过的次数。最后遍历一遍所有的点,找出和总路径数相同的点就是关键点。

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int M=4e4+10;
const int N=1e6+10;
int n,m;
vector<int> mp[1001];
int vis[1001];
int cnt[1001];
int sum;
void dfs(int cur,int e)
{
	if(cur==e)
	{
		sum++;
		for(int i=1;i<=n;i++)
		{
			if(vis[i]==1)
			cnt[i]++;
		}
		return ;
	}
	for(int i=0;i<mp[cur].size();i++)
	{
		int k=mp[cur][i];
		if(!vis[k])
		{
			vis[k]=1;
			dfs(k,e);
			vis[k]=0;
		}
	}
}
void solve()
{
	cin>>n>>m;
	for(int i=0,x,y;i<m;i++)
	{
		cin>>x>>y;
		mp[x].push_back(y);
		mp[y].push_back(x);
	}
	int s,e;
	cin>>s>>e;
	vis[s]=1;
	dfs(s,e);
	int ans=0;
	if(sum>0)
	{
		for(int i=1;i<=n;i++)
		{
			if(cnt[i]==sum)
			ans++;
		}
		cout<<ans-2<<endl;
	}
	else
	cout<<-1<<endl;
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	ll t=1;
//	cin>>t;
	while(t--)
	{	
		solve();
	}
	return 0;
}
相关推荐
余华余华17 分钟前
2024年蓝桥杯Java B组省赛真题超详解析-分布式队列
java·职场和发展·蓝桥杯
曦月逸霜44 分钟前
蓝桥杯高频考点——高精度(含C++源码)
c++·算法·蓝桥杯
你今天刷题了吗?1 小时前
备考蓝桥杯,相同的树
蓝桥杯
明.2444 小时前
DFS 洛谷P1123 取数游戏
算法·深度优先
菜鸡中的奋斗鸡→挣扎鸡8 小时前
第十一届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组
职场和发展·蓝桥杯
玉树临风ives12 小时前
leetcode 2360 图中最长的环 题解
算法·leetcode·深度优先·图论
三歪爱三玖13 小时前
【蓝桥杯】单片机设计与开发,速成备赛
单片机·职场和发展·蓝桥杯
三歪爱三玖16 小时前
【蓝桥杯】单片机设计与开发,RTC实时时钟
单片机·蓝桥杯·实时音视频
wuqingshun31415918 小时前
蓝桥杯 XYZ
数据结构·c++·算法·职场和发展·蓝桥杯
float_六七18 小时前
蓝桥杯第十六届模拟赛——基础细节考频分析
职场和发展·蓝桥杯