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

题目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)

发现问题,可以留言指教哦。小白一个害羞

猜你喜欢

转载自blog.csdn.net/xx_123_1_rj/article/details/80287535