阿里巴巴2018实习生-算法工程师笔试题2

题目要求:

三年二班的同学们要去郊游了,他们决定所有人都从一个地方出发,但是每个人都要有不同的路线,最终完成一次郊游。所以他们想知道,在它们去的公园里,究竟有多少种不同的路线供选择。公园可以被描述为一个具有N个结点,M条有向边的图,你要做的任务就是,选择其中某个点,使得其能够产生尽量多的从这个点出发的路线。
提示:此处可以利用node代表结点的总数,结点编号从0到node-1。edge用来描述边。你的程序应该返回路径最多的结点对应的路径数。
注意:所有的边都是有向边!数据输入将保证不包含环路,不包括重复的边。
输入数据示例:
node = 4  edge = {{0, 1}, {1, 2}, {2, 3}, {0, 2}},包含4条有向边
输出结果:5
示例解释:显然,0号节点应该是起点。对应的5条路线为:
0 1
0 1 2
0 1 2 3
0 2
0 2 3

Python实现

# 阿里巴巴2018实习生-算法工程师附加卷-编程题2  
# 解题思路:运用邻接表的思想。定义两个字典,s_pre存放前面路径可以到达该路径的结点编号,s_after存放该路径可以到达的结点编号。遍历一遍所有的边,得出结果。
# Created on 2018年5月12日
# @author: Hobart
# s_pre {1: [0], 2: [0, 0, 1], 3: [0, 0, 1, 2]}
# s_after {0: [1, 2], 1: [2], 2: [3]}
# num {0: 5, 1: 2, 2: 1}
# 5
 def maxPath(data):
    num={}
    s_pre={} 
    s_after={}
    for value in data:
        val_after=[] if value[0] in s_after and value[1] in s_after[value[0]] else [value[1]]
        s_after[value[0]]=s_after.get(value[0],[])+s_after.get(value[1],[])+val_after  # 该路径上开始结点之后可以经过的结点
        val_pre=[] if value[1] in s_pre and value[0] in s_pre[value[1]] else [value[0]]
        s_pre[value[1]]= s_pre.get(value[1],[])+s_pre.get(value[0],[])+val_pre # 该路径上结尾结点之前经过的结点
        num[value[0]]=num.get(value[0],0)+1+(len(s_after[value[1]]) if value[1] in s_after else 0)#该路径结点拥有的路径数
        if value[0] in s_pre:  # 更近之前可以到达该路径的结点所能到达的节点数
            for i in s_pre[value[0]]:
                num[i]=num[i]+1+(len(s_after[value[1]]) if value[1] in s_after else 0)
        m=max(num.items(), key=lambda x: x[1])
    return list(m)[1]
s = [[0, 1],[1, 2], [2, 3], [0, 2]]
s1=[[0, 1], [0, 2],[0,4], [1, 2], [2, 3],[4,2]]
data=sorted(s,key=lambda x: (x[0], x[1])) # 对数据进行从小到大排序
result=maxPath(data)
print(result)

欢迎留言,多多指教,向敬爱的社长学习

点赞