地铁换乘线路最少次数

362 阅读1分钟

地铁换乘线路最少

代码:

#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))