本文引用自泽爷工作室http://www.zeyes.org/study/clang/189.html

算法思想:

1.在把生成树看成一个集合(开始集合为空,到各个结点的距离当然未知)
2.结点与集合之间的权值可以看成结点到集合距离
3.将第一个结点加入集合,并初始化集合与其他结点的距离
4.搜索集合与结点最小的权值(距离),并把这点加入集合
5.更新集合与结点之间的距离
6.不断重复4和5步,直到所有的结点都加入了集合
(实际上把一个结点加入集合的时候,可以记录这个结点的父节点,也就是前驱,这么说吧,当找到一个与集合最小的结点的时候,他与集合中哪一结点的距离最小,把他记录来,作为生成树的路径)

算法实现:

#include <stdio.h>

#define MAXN 100

#define INF 100001 /*INF表示不存在边的长度,用一个很大的数表示它*/

void prim(int [][MAXN], int [], int); //函数原型

int main(void)

{

   int i, j, t, n;

  int w[MAXN][MAXN], fa[MAXN]; /*w是邻接矩阵,fa[x]表示是结点x的父结点)*/

  //freopen("prim.in", "r", stdin); //打开文件

  //freopen("prim.out", "w", stdout);

  scanf("%d", &n);

  for(i = 1; i <= n; i++) for(j = 1; j <= n; j++ )

  {

    scanf("%d", &t); //数据读入

    w[i][j] = (t == 0) ? INF : t;

  }

  prim(w, fa, n); //调用函数

  for(i = 2; i <= n; i++) //打印结果

  printf("%d--->%d\n", i, fa[i]);

  return 0;

  }

void prim(int w[][MAXN], int fa[], int n)

{

  int i, j, m, k; int d[MAXN]; /*d[j]可以理解成结点j到生成树(集合)的距离,它的最终值是w[j][fa[j]]*/

  for(j = 1; j <= n; j++)

  {

    d[j] = (j == 1 ? 0 : w[1][j]); /*将第一个结点加入集合,并初始化集合与其他结点的距离*/

    fa[j] = 1; /*当前集合中有且只有一个结点1,其他结点暂时未加入集合,所以没有父结点,就先姑且初始化成1*/

  }

  for(i = 2; i <=n; i++)

  {

    m = INF;

    for(j = 1; j <= n; j++)

      if(d[j] <= m && d[j] != 0) m = d[k = j]; /*选取与集合距离最小的边*/

  d[k] = 0; /*0在这里表示与集合没有距离,也就是说赋值0就是将结点k添加到集合中*/

  for(j = 1; j <= n; j++) /*对刚加入的结点k进行扫描,更新d[j]的值*/

    if(d[j] > w[k][j] && d[j] != 0)

    {

      d[j] = w[k][j];

      fa[j] = k;

    }

  }

}

考研编程练习----Prim算法的c语言实现的更多相关文章

  1. 算法之prim算法

    最小生成树是数据结构中图的一种重要应用,它的要求是从一个带权无向完全图中选择n-1条边并使这个图仍然连通(也即得到了一棵生成树),同时还要考虑使树的权最小. prim算法就是一种最小生成树算法. 普里 ...

  2. Prim算法(一)之 C语言详解

    本章介绍普里姆算法.和以往一样,本文会先对普里姆算法的理论论知识进行介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现. 目录 1. 普里姆算法介绍 2. 普里姆算法图解 3. 普里 ...

  3. 最小生成树问题---Prim算法与Kruskal算法实现(MATLAB语言实现)

    2015-12-17晚,复习,甚是无聊,阅<复杂网络算法与应用>一书,得知最小生成树问题(Minimum spanning tree)问题.记之. 何为树:连通且不含圈的图称为树. 图T= ...

  4. 【算法】C语言趣味程序设计编程百例精解

    C语言趣味程序设计编程百例精解 C/C++语言经典.实用.趣味程序设计编程百例精解(1)  https://wenku.baidu.com/view/b9f683c08bd63186bcebbc3c. ...

  5. 图的建立(邻接矩阵)+深度优先遍历+广度优先遍历+Prim算法构造最小生成树(Java语言描述)

    主要参考资料:数据结构(C语言版)严蔚敏   ,http://blog.chinaunix.net/uid-25324849-id-2182922.html   代码测试通过. package 图的建 ...

  6. C++编程练习(10)----“图的最小生成树“(Prim算法、Kruskal算法)

    1.Prim 算法 以某顶点为起点,逐步找各顶点上最小权值的边来构建最小生成树. 2.Kruskal 算法 直接寻找最小权值的边来构建最小生成树. 比较: Kruskal 算法主要是针对边来展开,边数 ...

  7. 最小生成树(Minimum Spanning Tree)——Prim算法与Kruskal算法+并查集

    最小生成树——Minimum Spanning Tree,是图论中比较重要的模型,通常用于解决实际生活中的路径代价最小一类的问题.我们首先用通俗的语言解释它的定义: 对于有n个节点的有权无向连通图,寻 ...

  8. 数据结构代码整理(线性表,栈,队列,串,二叉树,图的建立和遍历stl,最小生成树prim算法)。。持续更新中。。。

    //归并排序递归方法实现 #include <iostream> #include <cstdio> using namespace std; #define maxn 100 ...

  9. Prim算法---最小生成树

    最小生成树的Prim算法也是贪心算法的一大经典应用.Prim算法的特点是时刻维护一棵树,算法不断加边,加的过程始终是一棵树. Prim算法过程: 一条边一条边地加, 维护一棵树. 初始 E = {}空 ...

随机推荐

  1. host 'xx' is not allowed to connect to this MySql server

    update mysql.user set host = '%' where user = 'root'; FLUSH PRIVILEGES; select * from mysql.user;

  2. 015.1 Lock接口

    内容:Lock接口使用步骤,同步生产大白兔奶糖的例子 同步代码块的锁是隐式的,显式容易让我们理解.所以我们使用这个显式的方法,方便理解代码.######实现同步步骤:1.获取锁:lock()2.同步代 ...

  3. Buffers与cached啥区别

    A buffer is something that has yet to be “written” to disk. A cache is something that has been “read ...

  4. webpack环境搭建开发环境,JavaScript面向对象的详解,UML类图的使用

    PS:因为所有的设计模式都是基于面向对象来完成的,所以在讲解设计模式之前先来过一下面向对象都有哪些知识点 搭建开发环境 初始化npm环境 下载安装nodejs安装即可,nodejs自带npm管理包,然 ...

  5. 历史在重演:从KHTML到WebKit,再到Blink

    http://36kr.com/p/202396.html 上周四,Google宣布从WebKit 分支出自己的浏览器渲染引擎 Blink.很多人觉得这像是晴天霹雳,或者甚至是迟到的愚人节笑话,但是其 ...

  6. php中session中的反序列

    1.php   键名 + 竖线 + 经过 serialize() 函数反序列处理的值2.php_binary    键名的长度对应的 ASCII 字符 + 键名 + 经过 serialize() 函数 ...

  7. OAuth2.0认证和授权机制讲解

    第一章.OAuth2.0 介绍 OAuth认证 OAuth认证是为了做到第三方应用在未获取到用户敏感信息(如:账号密码.用户PIN等)的情况下,能让用户授权予他来访问开放平台(主要访问平台中的资源服务 ...

  8. 如何求出数组中最小(或者最大)的k个数(least k问题)

    输入n个整数,如何求出其中最小的k个数? 解法1. 当然最直观的思路是将数组排序,然后就可以找出其中最小的k个数了,时间复杂度以快速排序为例,是O(nlogn): 解法2. 借助划分(Partitio ...

  9. TTL电平, RS232电平以及CMOS电平的区别

    TTL电平标准 输出 L: <0.8V : H:>2.4V. 输入 L: <1.2V : H:>2.0V TTL器件输出低电平要小于0.8V,高电平要大于2.4V.输入,低于1 ...

  10. js随笔--关于数组

    1.split()将一个字符串分割成字符串数组 stringObject.split(separator,howmany) separator:必需,字符串或正则表达式,从该参数指定的地方分割stri ...