解题思路:

对于关键点的理解:关键点的特点就是所有可行通道都要经过它,那么在搜索过程中,每找到一个可行通道,把这个通道上所有的点计数,记录这个站点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;
}


点赞(1)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论