本文引用自泽爷工作室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. javaservlet处理四种常用api请求get,put,post,delete

    一般在网站搭建中servlet只需处理post,get请求便足已.本篇注重使用javaweb编写restful风格api,在servlet中对四种常用请求进行处理. 在api中对于一个请求要做的通常是 ...

  2. DQL、DML、DDL、DCL概念与区别

    SQL(Structure Query Language)语言是数据库的核心语言. SQL的发展是从1974年开始的,其发展过程如下:1974年-----由Boyce和Chamberlin提出,当时称 ...

  3. 揭秘:C++编译器的函数编译流程

    http://www.cnblogs.com/zhenjing/archive/2010/10/20/1856309.html C++中的类型查找过程相对简单,基本上就是名字查找,这里不再介绍. 对于 ...

  4. 2241. [SDOI2011]打地鼠【暴力+剪枝】

    Description 打地鼠是这样的一个游戏:地面上有一些地鼠洞,地鼠们会不时从洞里探出头来很短时间后又缩回洞中.玩家的目标是在地鼠伸出头时,用锤子砸其头部,砸到的地鼠越多分数也就越高. 游戏中的锤 ...

  5. python SimpleHTTPServer

    Python2 使用的是SimpleHTTPServer python -m SimpleHTTPServer Python3 合并到了http.server python -m http.serve ...

  6. 第一篇markdown笔记

    博客的样式设置 1 2 3 参考第一篇博客 参考第二篇博客 高效的写博客 博客园虽然支持markdown,但是好多快捷键都不支持,以后可以先在马克飞象上写好markdown笔记,再复制到博客上.

  7. PyTorch Notes | PyTorch 编程实践笔记

    [ 今天最开心的事情! ] PyTorch的stable版本更新为1.0之后,原本3D模型无脑out of memory.3D模型torch.backends.cudnn.benchmark必须Fal ...

  8. PAT——1065. 单身狗

    “单身狗”是中文对于单身人士的一种爱称.本题请你从上万人的大型派对中找出落单的客人,以便给予特殊关爱. 输入格式: 输入第一行给出一个正整数N(<=50000),是已知夫妻/伴侣的对数:随后N行 ...

  9. 【51nod 1685】 第K大区间2

    题目描述: 定义一个长度为奇数的区间的值为其所包含的的元素的中位数.现给出n个数,求将所有长度为奇数的区间的值排序后,第K大的值为多少. 样例解释: [l,r]表示区间的值 [1]:3 [2]:1 [ ...

  10. 软工之404 Note Found团队

    如果记忆是一个罐头的话,我希望这一罐罐头不会过期----<重庆森林> 404 Note Found Team 如果记忆是一个备忘录的话,别说了,它不会过期----<404 Note ...