原题链接:蓝桥杯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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复