地铁换乘线路最少
代码:
#coding:utf-8
#地铁转乘的最少站数
from collections import deque,defaultdict
n = 2 #地铁的线路 一共有2条
d = {0:{1,2,7},1:{3,6,7}}
start = 1 #从一号站
target = 10#到11号站
#1.先构造一个图
def islink(d1,d2):
return d1&d2
def bfs(link_line,s,t,num_set):
#print(s,t)
#print(num_set)
if s&t:
return 1
cnt = 0
que = deque()
for i in s:
que.append(i)
num_set.remove(i)
while que:
cnt += 1
for _ in range(len(que)):
n = que.popleft()
#print(n)
if n in t:
return cnt
for j in link_line[n]:
if j not in num_set:
continue
num_set.remove(j)
que.append(j)
#print(que)
return -1
def f1(n,d,start,target):
link_line = defaultdict(set)
for i in range(n):
if start in d[i]:
link_line['s'].add(i)
if target in d[i]:
link_line['t'].add(i)
for j in range(i+1,n):
if islink(d[i],d[j]):
link_line[i].add(j)
link_line[j].add(i)
#print(link_line)
return bfs(link_line,link_line['s'],link_line['t'],set(range(n)))
print(f1(n,d,start,target))