【大话数据结构C语言】46 最小生成树(克鲁斯卡尔算法)

举报
CodeAllen 发表于 2021/10/30 01:01:42 2021/10/30
【摘要】 欢迎关注我的公众号是【CodeAllen】,关注回复【1024】获取资源 程序员技术交流①群:736386324 ,程序员技术交流②群:371394777     无论是普里姆算法(Prim)还是克鲁斯卡尔算法(Kruskal),他们考虑问题的出发点都是:为使生成树上边的权值之和达到最小,则应使...

欢迎关注我的公众号是【CodeAllen】,关注回复【1024】获取资源
程序员技术交流①群:736386324 ,程序员技术交流②群:371394777    

无论是普里姆算法(Prim)还是克鲁斯卡尔算法(Kruskal),他们考虑问题的出发点都是:为使生成树上边的权值之和达到最小,则应使生成树中每一条边的权值尽可能的小。 

 

普里姆算法是以某顶点为起点,逐步找各个顶点上最小权值的边来构建最小生成树的

 

kruskal.c


  
  1. int Find(int *parent, int f)
  2. {
  3. while( parent[f] > 0 )
  4. {
  5. f = parent[f];
  6. }
  7. return f;
  8. }
  9. // Kruskal算法生成最小生成树
  10. void MiniSpanTree_Kruskal(MGraph G)
  11. {
  12. int i, n, m;
  13. Edge edges[MAGEDGE]; // 定义边集数组
  14. int parent[MAXVEX]; // 定义parent数组用来判断边与边是否形成环路
  15. for( i=0; i < G.numVertexes; i++ )
  16. {
  17. parent[i] = 0;
  18. }
  19. for( i=0; i < G.numEdges; i++ )
  20. {
  21. n = Find(parent, edges[i].begin); // 4 2 0 1 5 3 8 6 6 6 7
  22. m = Find(parent, edges[i].end); // 7 8 1 5 8 7 6 6 6 7 7
  23. if( n != m ) // 如果n==m,则形成环路,不满足!
  24. {
  25. parent[n] = m; // 将此边的结尾顶点放入下标为起点的parent数组中,表示此顶点已经在生成树集合中
  26. printf("(%d, %d) %d ", edges[i].begin, edges[i].end, edges[i].weight);
  27. }
  28. }
  29. }

 

文章来源: allen5g.blog.csdn.net,作者:CodeAllen的博客,版权归原作者所有,如需转载,请联系作者。

原文链接:allen5g.blog.csdn.net/article/details/116808761

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。