代码随想录算法训练营第五十七天|53.寻宝
53.寻宝prim
53. 寻宝(第七期模拟笔试)
代码随想录
思路:prim是用于构建最小生成树的,prim算法主要分为三步,首先找离最小生成树最近的节点,然后把这个节点加入最小生成树,之后把和这个节点直接相连的点的距离和原来存储最小距离相比较,看能否替代。
v,e=map(int,input().split())
minDist=[10001]*(v+1)
visit=[False]*(v+1)
graph=[[10001]*(v+1) for _ in range(v+1)]
for i in range(e):v1,v2,val=map(int,input().split())graph[v1][v2]=valgraph[v2][v1]=val
for _ in range(v):min_value=10002cur=-1for i in range(1,v+1):if not visit[i] and minDist[i]<min_value:min_value=minDist[i]cur=ivisit[cur]=Truefor i in range(1,v+1):if not visit[i] and minDist[i]>graph[cur][i]:minDist[i]=graph[cur][i]
ans=0
for i in range(2,v+1):ans+=minDist[i]
print(ans)
53.寻宝kruskal
53. 寻宝(第七期模拟笔试)
代码随想录
思路:同样也是找最小生成树,kruskal的思路是先按照距离从小到大排序,然后将每个边的两个节点合成一个集合(使用并查集),遍历所有的边,如果两个节点已经属于同一个集合,那就不管了,否则就和为一个集合并将距离加入ans
father=[]def find(x):if father[x]!=x:father[x]=find(father[x])return father[x]def join(x1,x2):r1=find(x1)r2=find(x2)if r1!=r2:father[r2]=r1def main():global fatheredges=[]v,e=map(int,input().split())father=list(range(v+1))for _ in range(e):v1,v2,val=map(int,input().split())edges.append((v1,v2,val))edges.sort(key=lambda x:x[2])ans=0for v1,v2,val in edges:if find(v1)!=find(v2):ans+=valjoin(v1,v2)print(ans)if __name__=="__main__":main()