题目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(笔试时间2018-05-11 19:30) # 解题思路 深度优先搜索,用栈实现,符合的路径一直入栈,直到找不到合适的新结点,然后出栈 # 每出栈一次记录一次路径,出栈完成,则得出所有的路径 # @Time :2018/5/11 # @Author :LiuYinxing import copy def FindAllPath(one, node, path): st = [[one, one, -1]] # 第一个值表示,已经入栈的结点,第二个值表示下一个结点的起始位置,最后一个值表示下一个结点已经扩展了几次 sumpath = 0 # 记录路径数 while st: # 如果不为空 i, j, di, find = st[-1][0], st[-1][1], st[-1][2], 0 # 获取栈顶信息 i1, j1 = -1, -1 # 记录下一步可走的坐标 while di < node-1 and find == 0: di += 1 # 下一个结点 i1, j1 = j, di # 新的开始 if path[i1][j1] == 1: find = 1 if find == 1: # 找到新结点,入栈 st[-1][2] = di # 更新已经判断过的结点 st.append([i1, j1, -1]) # 添加先的可走路径 path[i1][j1] = 0 # 把路径标记为不可走 else: path[st[-1][0]][st[-1][1]] = 1 # 恢复可走路径 sumpath += 1 # 记录出栈几次,也就是有几条路径 st.pop() # 出栈 return sumpath-1 # 第一个入栈的不算要减去1 if __name__ == '__main__': node = 4 # 输入结点数 data = [[0, 1], [1, 2], [2, 3], [0, 2]] # 输入路径 maps = [[0] * node for _ in range(node)] # 转换成邻接矩阵(行是开始,列是结束) for v in data: maps[v[0]][v[1]] = 1 maxpath, I = -1, -1 # 获取最大路径数, 和选择的位置 for i in range(node): # 每个结点获取一次最大路径数 path = copy.deepcopy(maps) tmppath = FindAllPath(i, node, path) if tmppath > maxpath: maxpath, I = tmppath, i print('选择开始位置:',I,'最大路径数:', maxpath)
发现问题,可以留言指教哦。小白一个。