题目描述
解题思路
查询两点之间的危险系数,既查询两个点中间的关键点个数。
假设我们从1到6有n条路径,并且每条路径我们都要经过3那么3肯定是关键点!因为3被破坏了你就根本从1到不了6。
所以有几条路径,我们就经过关键点几次,我们应当构建一个关键点矩阵,最后数关键点遍历次数和路径数相等的点既为关键点。
一直找,一直找,直到找到我们想要的,这种情况使用dfs。
传入dfs的数据应该是当前所在点,要达到的终点,当前遍历过的路径
当该点出现在遍历过的路径时则查找邻接结点下一个,否则将该点添加到路径种并调用dfs
代码
#读入数据初始化数据
n,m=map(int,input().strip().split())
a=[[] for _ in range(n+1)]#初始化邻接矩阵,从1开始舍弃0所以范围是n+1
b=[0]*(n+1)#从1开始舍弃0所以范围是n+1
false_b=b.copy()
for _ in range(m):#读取数据构建邻接矩阵
x,y=map(int,input().strip().split())
a[x].append(y)
a[y].append(x)
u,v=map(int,input().strip().split())
cnt=0
#dfs
def dfs(u,v,l):
'''
:param u:当前结点
:param v: 终点
:param l: 当前走过路径
'''
global cnt
#遍历邻接表
for i in a[u]:
#当不是返回上一结点时继续寻找
if i in l:
#如果已经在当前走过的路径,则遍历邻接表的下一个点
continue
_l=l.copy()#传入下一步的路径集合,当前这一步的路径集合要拿来判断,而且要用浅拷贝
_l.append(i)#路径上加上这一点
if i==v:
#如果找到终点了则把路径上的点全部加一遍1
for j in l:
b[j]+=1
cnt+=1
break
dfs(i,v,_l)
#调用dfs
dfs(u,v,[])
if b==false_b:#既两个结点中间没有可行路径所以b矩阵还是没有变
print(-1)
else:
print(b.count(cnt))