📜  门| GATE-CS-2015(套装3)|第 48 题(1)

📅  最后修改于: 2023-12-03 15:28:44.438000             🧑  作者: Mango

GATE-CS-2015(套装3)- 题目48

这道题目考查了程序员对于数据结构中最小生成树的算法的掌握以及对于优化算法的理解。在这道题目中,我们需要通过给定的图和其每个边的权重来找到这个图的最小生成树。同时我们需要根据题目中所给定的条件,对于已经找到的最小生成树进行优化处理。

为了解决这个问题,我们可以使用经典的Kruskal或Prim算法来找到图的最小生成树。这两个算法都基于贪心的思想,主要是通过选择当前权重最小的边,逐步地构建最小生成树。

接下来我们需要考虑题目中所给定的优化条件。根据题目的要求,我们需要删除最小生成树中所有一条权重最大边的那些节点。我们可以将这个过程分解成以下步骤:

  1. 找到最小生成树中的最大边,即权重最大的边。
  2. 从该边的两个端点开始,遍历整个最小生成树,将所有与该边有连接的边均从最小生成树中删除。

最后,我们就能得到最终经过优化的最小生成树。

下面是Kruskal算法的python实现,其中包含了题目中要求的优化步骤:

def find(parent, i):
    if parent[i] == i:
        return i
    return find(parent, parent[i])
    
def union(parent, rank, x, y):
    xroot = find(parent, x)
    yroot = find(parent, y)
    if rank[xroot] < rank[yroot]:
        parent[xroot] = yroot
    elif rank[xroot] > rank[yroot]:
        parent[yroot] = xroot
    else:
        parent[yroot] = xroot
        rank[xroot] += 1
        
def kruskal(edges, N):
    result = []
    i = 0
    e = 0
    edges = sorted(edges, key=lambda item: item[2])
    parent = []
    rank = []
    for node in range(N):
        parent.append(node)
        rank.append(0)
    while e < N - 1:
        u, v, w = edges[i]
        i += 1
        x = find(parent, u)
        y = find(parent, v)
        if x != y:
            e += 1
            result.append([min(u,v),max(u,v)])
            union(parent, rank, x, y)
    return result
    
def optimize(graph, edges):
    mst = kruskal(edges, len(graph))
    max_edge = max(mst, key=lambda item: graph[item[0]][item[1]])
    res = []
    for edge in mst:
        if edge != max_edge:
            res.append(edge)
    visited = set()
    for edge in res:
        visited.add(edge[0])
        visited.add(edge[1])
    for edge in mst:
        if edge != max_edge:
            if edge[0] not in visited or edge[1] not in visited:
                visited.add(edge[0])
                visited.add(edge[1])
                res.append(edge)
    return res
    
graph = [
    [0, 10, 6, 5],
    [10, 0, 0, 15],
    [6, 0, 0, 4],
    [5, 15, 4, 0]
]
edges = [
    [0, 1, 10],
    [0, 2, 6],
    [0, 3, 5],
    [1, 3, 15],
    [2, 3, 4]
]
print(optimize(graph, edges))

以上是本题的完整程序,其中包含了Kruskal算法的实现以及所要求的优化处理。通过这个程序,我们可以快速地找到给定图的最小生成树,并将其进行优化处理。