• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > 最小生成树算法之Prim算法

最小生成树算法之Prim算法

作者:砍柴1990 字体:[增加 减小] 来源:互联网 时间:2017-05-28

砍柴1990 通过本文主要向大家介绍了最小生成树算法,最小生成树prim算法,prim算法求最小生成树,最小生成树算法代码,图的最小生成树算法等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

本文介绍了最小生成树的定义,Prim算法的实现步骤,通过简单举例实现了C语言编程。

1.什么是最小生成树算法?
简言之,就是给定一个具有n个顶点的加权的无相连通图,用n-1条边连接这n个顶点,并且使得连接之后的所有边的权值之和最小。这就叫最小生成树算法,最典型的两种算法就是Kruskal算法和本文要讲的Prim算法。

2.Prim算法的步骤是什么?
这就要涉及一些图论的知识了。
a.假定图的顶点集合为V,边集合为E.
b.初始化点集合U={u}.//u为V中的任意选定的一点
c.从u的邻接结点中选取一点v使这两点之间的权重最小,然后将v加入集合U中.
d.从结点v出发,重复c步骤,直到V={}.

3.举个例子来说明Prim算法的步骤:
一个简单的加权拓扑图如下所示

选取1为初始点,则按照上面所示的步骤访问结点的顺序依次次为:

则最终访问结点的顺序:1,3,4,2,5.
4.Prim算法的具体C语言编程实现:

#include <stdio.h>
#include <cstdlib>
#include<memory.h>
const int Max =0x7fffffff;
const int N=50;
 
int n;
int g[N][N],dis[N],visited[N];
 
int prim()
{
  int i,j;
  int pos,min;
  int ans=0;
  memset(visited,0,sizeof(visited));
  visited[1]=1;pos=1;
  //assign a value to the dis[N] first
  for(i=2;i<=n;i++)
    dis[i]=g[pos][i];
  for(i=1;i<n;i++)
  {
    min=Max; 
    for(j=1;j<=n;j++)
    {
      if(visited[j]==0&&min>dis[j])
      {
        min=dis[j];
        pos=j; 
      }
    }
    printf("The node being traversed is :%d\n",pos);
    ans+=min;
    printf("The value of ans is %d\n",ans);
    //mark the node
    visited[pos]=1;
    //update the weight
    for(j=1;j<=n;j++)
      if(visited[j]==0&&dis[j]>g[pos][j])
        dis[j]=g[pos][j];
  }
  return ans;
}
 
int main()
{
  int i=1,j=1;
  int ans=0;
  int w;
  printf("Please enter the number of the nodes:\n");
  scanf("%d",&n);
  for(i=1;i<=n;i++)
    for(j=1;j<=n;j++)
    {
      if(i==j)
        g[i][j]=0;
      else
        g[i][j]=Max;
    }
  printf("Please enter the number of the edges:\n");
  int edgenum;
  scanf("%d",&edgenum);
  int v1,v2;
  printf("Please enter the number and the corresponding weight:\n");
  for(i=1;i<=edgenum;i++)
  {
    scanf("%d%d%d",&v1,&v2,&w);
    g[v1][v2]=g[v2][v1]=w;
  }
  ans=prim();
  printf("The sum of the weight of the edges is:%d\n",ans);
  system("pause");
  return 0;
   
}
</div>

5.程序运行后的结果截图

以上就是本文的全部内容,希望对大家的学习有所帮助。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 详解次小生成树以及相关的C++求解方法
  • 详解图的应用(最小生成树、拓扑排序、关键路径、最短路径)
  • 最小生成树算法之Prim算法
  • 最小生成树算法C语言代码实例

相关文章

  • 2017-05-28C++算法之在无序数组中选择第k小个数的实现方法
  • 2017-05-28iostream与iostream.h的区别详细解析
  • 2017-05-28关于C/C++中static关键字的作用总结
  • 2017-05-28用C语言获取文件的大小示例分享
  • 2017-05-28解析C++编程中如何使用设计模式中的状态模式结构
  • 2017-05-28深入分析C语言中结构体指针的定义与引用详解
  • 2017-05-28简述C语言中system()函数与vfork()函数的使用方法
  • 2017-05-28CFileDialog的钩子函数解决对话框的多选之DoModal问题
  • 2017-05-28浅析结束程序函数exit, _exit,atexit的区别
  • 2017-05-28C语言读取BMP图像数据的源码

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 简单总结C语言中的运算符优先级
    • 关于统计数字问题的算法
    • C++ 中使用lambda代替 unique_ptr 的Deleter的方法
    • c++中拷贝构造函数的参数类型必须是引用
    • 用typedef定义类型的总结分析
    • C语言编程中函数的基本学习教程
    • C++中delete和delete[]的区别说明
    • C++用mysql自带的头文件连接数据库
    • C++ using namespace std 用法深入解析
    • VC编程控件类HTControl之CHTGDIManager GDI资源管理类用法解析

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有