1489. Find Critical and Pseudo-Critical Edges in Minimum Spanning Tree
难度:Difficulty
- 题意:求解最小生成树的必须边和非必须边
- 做法显然。
class Solution:
INF = 0x3f3f3f3f
def Prim(self, n, G, MST):
d = [(-1,-1,self.INF)]*n
d[0] = (-1,-1,0)
vis = [False] * n
for i in range(n):
u = -1
for v in range(n):
if not vis[v] and (u==-1 or d[v][2]<d[u][2]):
u = v
if d[u][0] != -1:
p = d[u][1]
MST[p].append((d[u][0],u,d[u][2]))
MST[u].append((d[u][0],p,d[u][2]))
vis[u] = True
for e, v, w in G[u]:
if not vis[v] and w<d[v][2]:
d[v] = (e, u, w)
def find(self, MST, aim, cur, p, route):
if cur == aim:
return True
for e, v, w in MST[cur]:
if v == p:
continue
route.append(e)
if self.find(MST, aim, v, cur, route):
return True
route.pop()
return False
def findCriticalAndPseudoCriticalEdges(self, n: int, edges: List[List[int]]) -> List[List[int]]:
G = []
MST = []
m = len(edges)
for i in range(n):
G.append([])
MST.append([])
for e in range(m):
u, v, w = edges[e][0], edges[e][1], edges[e][2]
G[u].append((e, v, w))
G[v].append((e, u, w))
self.Prim(n, G, MST)
is_critical = [False] * m
is_pseudo_critical = [False] * m
for u in range(n):
for e, v, w in MST[u]:
is_critical[e] = True
for e in range(m):
u, v, w = edges[e][0], edges[e][1], edges[e][2]
route = []
self.find(MST, v, u, -1, route)
if len(route) == 1:
continue
flag = False
for road in route:
if edges[road][2] == w:
is_pseudo_critical[road] = True
is_critical[road] = False
flag = True
if flag:
is_pseudo_critical[e] = True
critical = []
pseudo_critical = []
for e in range(m):
if is_critical[e]:
critical.append(e)
elif is_pseudo_critical[e]:
pseudo_critical.append(e)
return [critical, pseudo_critical]