危险系数蓝桥杯python解法

2 篇文章 0 订阅

题目描述

解题思路

查询两点之间的危险系数,既查询两个点中间的关键点个数。

假设我们从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))

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值