📜  门| GATE CS Mock 2018年|套装2 |问题7(1)

📅  最后修改于: 2023-12-03 14:58:22.875000             🧑  作者: Mango

题目7

这是一道关于计算机网络中路由选择协议的问题,题目描述如下:

给定一个n个节点、m条边的带权无向图,节点从1到n标号,现在请你求出从x号点到y号点的最短路中经过的边数的最大值,如果从x到y没有路径,那么输出-1。

这道题目可以通过Dijkstra算法来解决,Dijkstra算法是E.W. Dijkstra于1956年提出的一种单源最短路径算法,其具体思路就是从起点开始,逐步扩大范围,直到到达终点。

Dijkstra算法的流程如下:

1.将起点标记为起点到自身的距离为0,其他点标记为未知距离(或无穷)。

2.从未确定的点中选取距离最小的点作为中转点,计算出从起点到这个点的距离,然后将这个点标记为已确定的距离。

3.遍历当前已确定的距离的所有邻居,如果从起点到它经过当前的中转点更短,那么更新这个邻居的距离。

4.重复第二步和第三步,直到到达目标节点或者所有节点都已经被标记为已确定的距离。

下面是一个基于Dijkstra算法的Python代码实现,可以解决上述问题:

INF=float('inf')

def Dijkstra_algorithm(graph, start, end):
    n = len(graph)
    dist = [INF]*n
    dist[start] = 0
    visited = [False]*n
    
    for i in range(n):
        u = -1
        for j in range(n):
            if not visited[j] and (u == -1 or dist[j] < dist[u]):
                u = j
        visited[u] = True
        
        if u == end:
            return dist[end]
        
        for v in range(n):
            if graph[u][v] != -1 and dist[v] > max(dist[u], graph[u][v]):
                 dist[v] = max(dist[u], graph[u][v])

    return -1

if __name__ == '__main__':
    # TestCase
    n = 5
    m = 7
    x = 1
    y = 5
    edges =[(1,2,4),(1,3,10),(2,3,2),(2,4,7),(3,4,5),(3,5,6),(4,5,1)]
    
    graph = [[-1 for j in range(n)] for i in range(n)]
    for u, v, w in edges:
        graph[u-1][v-1] = w
        graph[v-1][u-1] = w
    print("Result:",Dijkstra_algorithm(graph,x-1,y-1))

代码中,我们首先定义了一个求最短路的函数 Dijkstra_algorithm(),其中 dist 数组保存的是起点到每个点的距离,visited 数组用于标记每个点是否被访问过。

在每一个循环中,我们通过贪心的思想选择当前未确定距离中与起点距离最小的点作为中转点 u。如果 u 已经是终点,那么直接返回 dist[end];否则,我们遍历所有和 u 相邻的点,并更新其距离dist[v]。特别地,如果通过中转点 u 到 v 的距离更小,那么我们就更新 dist[v]。这里需要注意的是,在更新dist[v]时,我们将其和通过 u 到 v 的距离之间的较大值取作dist[v]。

最后,如果在整个过程中没有得到到达终点的最短路,则返回-1。

希望这份代码可以帮助到你!