考研编程练习----Prim算法的c语言实现
本文引用自泽爷工作室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语言实现的更多相关文章
- 算法之prim算法
最小生成树是数据结构中图的一种重要应用,它的要求是从一个带权无向完全图中选择n-1条边并使这个图仍然连通(也即得到了一棵生成树),同时还要考虑使树的权最小. prim算法就是一种最小生成树算法. 普里 ...
- Prim算法(一)之 C语言详解
本章介绍普里姆算法.和以往一样,本文会先对普里姆算法的理论论知识进行介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现. 目录 1. 普里姆算法介绍 2. 普里姆算法图解 3. 普里 ...
- 最小生成树问题---Prim算法与Kruskal算法实现(MATLAB语言实现)
2015-12-17晚,复习,甚是无聊,阅<复杂网络算法与应用>一书,得知最小生成树问题(Minimum spanning tree)问题.记之. 何为树:连通且不含圈的图称为树. 图T= ...
- 【算法】C语言趣味程序设计编程百例精解
C语言趣味程序设计编程百例精解 C/C++语言经典.实用.趣味程序设计编程百例精解(1) https://wenku.baidu.com/view/b9f683c08bd63186bcebbc3c. ...
- 图的建立(邻接矩阵)+深度优先遍历+广度优先遍历+Prim算法构造最小生成树(Java语言描述)
主要参考资料:数据结构(C语言版)严蔚敏 ,http://blog.chinaunix.net/uid-25324849-id-2182922.html 代码测试通过. package 图的建 ...
- C++编程练习(10)----“图的最小生成树“(Prim算法、Kruskal算法)
1.Prim 算法 以某顶点为起点,逐步找各顶点上最小权值的边来构建最小生成树. 2.Kruskal 算法 直接寻找最小权值的边来构建最小生成树. 比较: Kruskal 算法主要是针对边来展开,边数 ...
- 最小生成树(Minimum Spanning Tree)——Prim算法与Kruskal算法+并查集
最小生成树——Minimum Spanning Tree,是图论中比较重要的模型,通常用于解决实际生活中的路径代价最小一类的问题.我们首先用通俗的语言解释它的定义: 对于有n个节点的有权无向连通图,寻 ...
- 数据结构代码整理(线性表,栈,队列,串,二叉树,图的建立和遍历stl,最小生成树prim算法)。。持续更新中。。。
//归并排序递归方法实现 #include <iostream> #include <cstdio> using namespace std; #define maxn 100 ...
- Prim算法---最小生成树
最小生成树的Prim算法也是贪心算法的一大经典应用.Prim算法的特点是时刻维护一棵树,算法不断加边,加的过程始终是一棵树. Prim算法过程: 一条边一条边地加, 维护一棵树. 初始 E = {}空 ...
随机推荐
- 解决Could not commit JPA transaction RollbackException: Transaction marked as rollbackOnly
项目测试发生问题,方法正常结束,但是报了 Could not commit JPA transaction; nested exception is javax.persistence.Rollbac ...
- navicat连接PostgreSQL报:column “rolcatupdate” does not exist ...错误的解决办法
avicat premium 连接PostgreSQL出现: column “rolcatupdate” does not exist ... 错误如图: 解决方案: 看看你的navicat 是否为最 ...
- BZOJ 1015 星球大战starwar 逆向并查集
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1015 题目大意: 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个 ...
- BZOJ 1012 最大数maxnumber 线段树
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1012 题目大意: 见链接 思路: 直接用线段树模拟一下就可以了. #include&l ...
- 【[HNOI2012]矿场搭建】
抄题解真开心 我真是越来越菜了 这是点双的板子题,于是求出所有点双,之后讨论 如果点双里之有一个割点,那么如果这个割点炸了,这个点双就出不去了,于是我们得在这个点双内部除了这个割点位置放一个 如果有两 ...
- F2eTest和uirecorder自动化测试环境部署填坑记录
坑1:尝试部署的时候只在opennode.bat里面填写了两个浏览器,测试通过后再增加其他浏览器,页面上一直不显示. 填坑:需要清空数据库里的`wd_browsers`和`wd_nodes`表,然后重 ...
- [19/04/27-星期六] GOF23_结构型模式(装饰模式、外观模式)
一.装饰模式(decorator) 职责:动态的为一个对象增加新的功能. 是一种用于代替继承的技术,无须通过继承增加子类就能扩展对象的新功能.使用对象的关联关系代替继承关系,更加灵活,避免类体系的膨胀 ...
- lazysizes-好用的延迟加载JS插件
此插件可直接引入lazysizes即可 <script src="lazysizes.min.js"></script> 延迟加载(lazy load)是( ...
- 3、Android-全局大喇叭-广播机制
所谓的官博机制可以理解成为1对多的概念 即一个喇叭所有的人都能听到(统一范围内) 为了便于及逆行系统级别的消息通知 Android引入了一套广播机制 而且更容易进行实现. 3.1.广播机制的简介 再A ...
- PAT——1040. 有几个PAT
字符串APPAPT中包含了两个单词“PAT”,其中第一个PAT是第2位(P),第4位(A),第6位(T):第二个PAT是第3位(P),第4位(A),第6位(T). 现给定字符串,问一共可以形成多少个P ...