时间限制: | 1.0s |
内存限制: | 512.0MB |
问题描述: | 样例输入 4 样例输出 4 样例说明 下图是样例说明。 |
求最小生成树的最大边,注意要用优化算法。另外,还是克鲁斯卡尔算法快些,不过还得看点和边的情况
class node:
fro=to=dist=0
def getfx(x):
if fa[x]==x:
return fa[x]
fa[x] = getfx(fa[x])
return fa[x]
def merge(x,y):
tx = getfx(x)
ty = getfx(y)
fa[tx] = ty
while True:
try:
graph = []
n = int(input())
m = int(input())
root = int(input())
for i in range(m):
a,b,c = map(int,input().split())
graph.append([a,b,c])
#print(graph[i].dist)
graph = sorted(graph,key = lambda x:x[2])
# for i in range(m):
# print(graph[i][2])
fa = [0 for i in range(100005)]
for i in range(n+1):
fa[i]=i
#print(1)
# for i in range(m):
# print(graph[i].dist)
ans = -1
last = n
k = 0
while k<m and last>1:
u = graph[k][0]
v = graph[k][1]
if not (getfx(u)==getfx(v)):
merge(u,v)
last-=1
#ans+=graph[k][2]
ans = max(ans,graph[k][2])
k+=1
print(ans)
except:
break
转的:
from queue import PriorityQueue as pQueue
# 用优先队列实现的prim算法
def prim(start, graph):
n = len(graph)
pq = pQueue() # 队列中的元素为[cost, v]形式,cost是该路径的花销, v是去往的结点
visited = [False for _ in range(n)]
t = {}
parents = [-1 for _ in range(n)]
pq.put([0, start, -1])
while len(t) < n:
# 从优先队列中找出未被确定的最短路径
minPath = pq.get()
while visited[minPath[1]]:
minPath = pq.get()
minNode = minPath[1]
visited[minNode] = True
t[minNode] = minPath[0]
parents[minNode] = minPath[2]
# 从该最短路径的结点开始找邻边,入队
for edge in graph[minPath[1]]:
if not visited[edge[0]]:
pq.put([edge[1], edge[0], minNode])
return t, parents
n = int(input())
m = int(input())
root = int(input()) - 1
graph = [[] for _ in range(n)]
for i in range(m):
v, u, t = map(int, input().split())
v -= 1
u -= 1
graph[v].append([u, t])
graph[u].append([v, t])
t, parents = prim(root, graph)
ans = 0
for k, v in t.items():
if v > ans:
ans = v
print(ans)