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;
}
相关推荐
比特在路上1 小时前
蓝桥杯之c++入门(四)【循环】
c++·职场和发展·蓝桥杯
利刃大大15 小时前
【回溯+剪枝】找出所有子集的异或总和再求和 && 全排列Ⅱ
c++·算法·深度优先·剪枝
皮卡丘のcoding15 小时前
蓝桥杯备赛练习题01
职场和发展·蓝桥杯
Hhyao15 小时前
2024第十五届蓝桥杯网安赛道省赛题目--cc(CyberChef)/crypto
蓝桥杯·密码学
不过四级不改名67715 小时前
蓝桥杯嵌入式uart,iic,adc_scan模版
职场和发展·蓝桥杯
清弦墨客16 小时前
【蓝桥杯】43697.机器人塔
python·蓝桥杯·程序算法
某个默默无闻奋斗的人20 小时前
深度优先搜索(DFS)
算法·深度优先
JNU freshman1 天前
蓝桥杯思维训练营(一)
蓝桥杯
KuaCpp1 天前
搜索与图论复习1
算法·深度优先·图论
比特在路上2 天前
蓝桥杯之c++入门(一)【第一个c++程序】
开发语言·c++·职场和发展·蓝桥杯