一道简单的dfs题
题目描述
抗日战争时期,冀中平原的地道战曾发挥重要作用。
地道的多个站点间有通道连接,形成了庞大的网络。但也有隐患,当敌人发现了某个站点后,其它站点间可能因此会失去联系。
我们来定义一个危险系数DF(x,y):
对于两个站点 x 和 y (x!=y), 如果能找到一个站点 z,当 z 被敌人破坏后,x 和 y 不连通,那么我们称z 为关于 x,y 的关键点。相应的,对于任意一对站点 x 和 y,危险系数 DF(x,y) 就表示为这两点之间的关键点个数。
本题的任务是:已知网络结构,求两站点之间的危险系数。
输入描述
输入数据第一行包含 2 个整数n (2≤n≤1000),m (0≤m≤2000),分别代表站点数,通道数;
接下来 mm 行,每行两个整数 u,v (1≤u,v≤n,u!=v) 代表一条通道;
最后 1 行,两个数 u,v,代表询问两点之间的危险系数 DF(u, v)。
输出描述
输出一个整数,如果询问的两点不连通则输出 -1.
输入输出样例
示例
输入
7 6
1 3
2 3
3 4
3 5
4 5
5 6
1 6
输出
2
思路
深度搜索所有能到达目标站点的路线,然后找出所有路线都包含的站点,这就是要找的关键站点。
代码
import os
import sys
# 请在此输入您的代码
m=list(map(int,input().split()))
Number_sites=m[0]
Number_channels=m[1]
channels=dict()
for i in range(Number_channels):
n=list(map(int,input().split()))
if n[0] not in channels:
channels[n[0]]=[]
channels[n[0]].append(n[1])
if n[1] not in channels:
channels[n[1]]=[]
channels[n[1]].append(n[0])
m=list(map(int,input().split()))
start=m[0]
end=m[1]
key=[]
keys=[]
def con(now):
global channels,end,key,keys
a=channels[now]
if end in a:
if len(key)==0:
for i in range(len(keys)):
key.append(keys[i])
else:
temp=[]
for i in range(len(key)):
if key[i] in keys:
temp.append(key[i])
key.clear()
for i in range(len(temp)):
key.append(temp[i])
return
for i in range(len(a)):
if a[i] in keys:
continue
keys.append(a[i])
con(a[i])
del keys[-1]
con(start)
print(len(key))
编码不易,如果有帮助的话点个赞支持一下吧~~~