题目背景
抗日战争时期,冀中平原的地道战曾发挥重要作用。
题目描述
地道的多个站点间有通道连接,形成了庞大的网络。但也有隐患,当敌人发现了某个站点后,其它站点间可能因此会失去联系。
我们来定义一个危险系数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 年第四届国赛文章来源:https://www.toymoban.com/news/detail-658669.html
解题思路
暴搜,我们可以求出所有的路径,并标记所有路径中的点,当某个点被标记的数量等于总路径数量时,这个点就为关键点文章来源地址https://www.toymoban.com/news/detail-658669.html
代码实现
#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;
}
到了这里,关于P8604 [蓝桥杯 2013 国 C] 危险系数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!