📜  门| GATE 2017 MOCK II |问题24(1)

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

门| GATE 2017 MOCK II |问题24

本题为GATE 2017 MOCK II中的第24个问题,是一道与图论相关的问题。 它要求我们找到一个给定图中的最小生成树,并计算其权重。

解决这个问题的关键是使用Prim或Kruskal算法来找到最小生成树。 这两种算法都是经典的图算法,用于确定权重最小的树。 我们可以使用Python来实现这些算法。

下面是Python代码的示例,用于找到给定图的最小生成树(使用Kruskal算法):

class Graph:
 
    def __init__(self, vertices):
        self.V = vertices
        self.graph = []
 
    def add_edge(self, u, v, w):
        self.graph.append([u, v, w])
 
    def find(self, parent, i):
        if parent[i] == i:
            return i
        return self.find(parent, parent[i])
 
    def union(self, parent, rank, x, y):
        xroot = self.find(parent, x)
        yroot = self.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_mst(self):
 
        result =[] #最终生成树的结果
        i = 0 #表示森林的大小
        
        e = 0 # An index variable, used for sorted edges
        self.graph = sorted(self.graph,key=lambda item: item[2])
 
        parent = []
        rank = []
 
        for node in range(self.V):
            parent.append(node)
            rank.append(0)
 
        while i < self.V -1 :
 
            u,v,w =  self.graph[e]
            e = e + 1
            x = self.find(parent, u)
            y = self.find(parent ,v)
 
            if x != y:
                i = i + 1    
                result.append([u,v,w])
                self.union(parent, rank, x, y)            
 
        print "Following are the edges in the constructed MST"
        for u,v,weight  in result:
            print "%d - %d: %d" % (u,v,weight)

上面的代码实现是使用Kruskal算法,在给定的图中找到最小生成树,并在控制台中打印出其权重和最终边的列表。

我们还可以使用Prim算法来找到最小生成树,如下所示:

from collections import defaultdict
import heapq
 
class Graph:
 
    def __init__(self, V):
        self.V = V
        self.graph = defaultdict(list)
 
    def add_edge(self,u,v,w):
        self.graph[u].append((v,w))
        self.graph[v].append((u,w))
 
    def prim_mst(self):
 
        min_heap = []
        visited = [False] * self.V
        parent = [-1] * self.V
        key = [float('inf')] * self.V
 
        start_node = 0
        key[start_node] = 0
        heapq.heappush(min_heap, (0,start_node))
 
        while min_heap:
 
            curr_wt, curr_node = heapq.heappop(min_heap)
            visited[curr_node] = True
 
            for neigh, wt in self.graph[curr_node]:
 
                if not visited[neigh] and wt < key[neigh]:
                    key[neigh] = wt
                    heapq.heappush(min_heap, (wt, neigh))
                    parent[neigh] = curr_node
 
        return parent, sum(key)

这是Prim算法的Python实现,用于查找给定图的最小生成树。 它返回最小生成树的父节点和总权重。

总的来说,要解决GATE 2017 MOCK II的问题24,我们需要使用Prim或Kruskal算法来找到给定图的最小生成树,并计算其权重。 在Python中,我们可以使用上面的示例代码来实现这些算法。