云边小卖部


私信TA

用户名:uq_40587598322

访问量:343

签 名:

等  级
排  名 5291
经  验 1498
参赛次数 0
文章发表 10
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:


解题思路:

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

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区