蓝桥杯危险系数

题目链接:http://oj.youdao.com/problem/P1277
思路就是到用一个数组来记录每个节点被访问的次数,如果起点和终点之间有点的访问次数和终点的访问次数一样,那么它就是关键点。
但需要注意的是:某些点它的访问次数可能是无法到达终点的,但我们还是把它的访问次数加上去了,所以我们必须用一个数组来记录访问路径,当到达终点时,再遍历整条路径,给这条路径的每个点的访问次数加一!!!

#include<bits/stdc++.h>
using namespace std;
int n,en,ans;     //节点数,终点,终点的访问次数 
int num[1005];    //访问次数 
int route[1005];  //访问路径 
bool vis[1005];   //访问标记数组 
bool graph[1005][1005];  //图 
void dfs(int st,int step)
{
	if(st==en)  //如果到达终点 
	{
		ans++;  //终点访问次数加一 
		for(int i=0;i<step;i++)  num[route[i]]++;   //给整条路径上的点的访问次数加一 
		return;
	}
	else 
	{   
		for(int i=1;i<=n;i++)  //遍历每一个点 
		{
			if(!vis[i]&&graph[st][i])  //如果没被访问过且有边 
			{   
				vis[i]=true;
				route[step]=i;  //记录路径 
				dfs(i,step+1);  //继续深搜 
				vis[i]=false;
			}
		}
	}	
}
int main()
{
	int m,u,v,st;
	while(cin>>n>>m)
	{
		for(int i=0;i<m;i++)
		{
			cin>>u>>v;
			graph[u][v]=graph[v][u]=true;  //建边 
		}
		cin>>st>>en;
		vis[st]=true;  //标记起点访问过 
		route[0]=st;   //记录下路径 
		ans=0;    //初始化终点的访问次数 
		dfs(st,1);  //从起点开始深搜 
		if(ans==0)  cout<<"-1"<<endl;  //如果终点没被访问过,则无解 
		else 
		{
			int counts=0;
			for(int i=1;i<=n;i++)
			   if(num[i]==ans)   //如果有点的访问次数和终点的访问次数相等 
			     counts++;  //关键点的个数加一 
			cout<<counts-2<<endl;  //需要减去起点和终点 
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_39905917/article/details/88663831