原题链接:蓝桥杯2013年第四届真题-危险系数
解题思路:
对于关键点的理解:关键点的特点就是所有可行通道都要经过它,那么在搜索过程中,每找到一个可行通道,把这个通道上所有的点计数,记录这个站点i被走过的次数a【i】,最后搜索完遍历站点进行检验,如果可行通道数等于这个点被走过的次数,说明它就是关键点
注意事项:注意一些判断前提
参考代码:
#include<bits/stdc++.h>
using namespace std;
bool vis[1005];
bool tx[1005][1005];
int a[1005];
int n,m,u,v,ans;
bool f;
void dfs(int x){
if(x==v){
f=true;
ans++;//从u走到v道路++
for(int i=1;i<=n;i++){
if(vis[i]) //特别容易遗漏 ,只有被访问过才能计数,不然每次都全部计数了一遍
a[i]++;//道路上所有点计数++,,如果时关键点(说明是必经之路),特点:所有可行道路都应该通过它,
}
return ;
}
for(int i=1;i<=n;i++){
if(!vis[i]&&tx[x][i]){
vis[i]=true;
dfs(i);
vis[i]=false;
}
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
int x,y;
cin>>x>>y;
tx[x][y]=true;//x到y可以通行
tx[y][x]=true;//注意这里也要标记,否则会重复搜索
}
cin>>u>>v;
dfs(u);
int cnt=0;
for(int i=1;i<=n;i++){
if(i!=u&&i!=v&&ans==a[i]){//找到关键点(除了起终点必经之点,每条路都要经过)
cnt++;
}
}
if(f)
cout<<cnt;
else
cout<<-1;
return 0;
}0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复