图(来源:<>p250)

#include

#include

#include

/*

* 邻接矩阵, prim普里姆算法(属贪婪算法),无向图,最小生成树

* 代码实现<>p250 图7-6-6,v0至v8分别用ABCDEFGHI代替(不过打印过程还是用的下标)

* 最终成生n-1条边的树,路径权值和最小

*/

#define MAX 9

#define INFINITY 65535

// 图结构体

typedef struct {

char vexs[MAX]; // 顶点的数组,顶点类型为了简单使用char

int arc[MAX][MAX]; // 边表二维数组,值为权

int numVex;

}GRAPH, *PGRAPH;

void create(PGRAPH);

void gprint(GRAPH);

void prim(GRAPH);

void prim(GRAPH graph)

{

int i, j, k, min;

// 保存相关节点的数组(也可叫作父子(前后)关系,下标为当前节点,值为前一个节点,形成1条边)

int adjVex[MAX];

// 保存节点相关的边的最小权值(这个是随着程序不断迭代而更新的)

int lowcost[MAX];

// 循环处理前的初始化工作

adjVex[0] = 0; // 以第1个顶点为开头,直接加入v0节点

lowcost[0] = 0; // v0节点不需要再计算权值,标识为0,0还有个意思表示该节点已经加入最小生成树

// 使用v0节点相关的数据,初始化上面2个数组

for (i=0; i

//先全部初始化为0,表示所有节点的前1个节点都先为v0

adjVex[i] = 0;

// v0节点相关的边权值加入数组,因为入口是v0节点,这些是目前可以看到的相关的边

lowcost[i] = graph.arc[0][i];

}

/*

* 开始循环处理,次数为n-1,n为节点数

*/

// v0入口节点已经加入过数组不需要处理,所以从1开始

for (i=1; i

// 每轮都需要计算当前未加入最小生成树中的节点相关的最小权的边

int min = INFINITY;

// 先在lowcost数组中找出当前可以看到的边中,权值最小的那条边

for (j=1; j

if (lowcost[j] !=0 && lowcost[j] < min) {

min = lowcost[j];

k = j;

}

}

// 新找到的最小权值的边的相关节点为新查找根节点,标识为0,放入最小生成树

lowcost[k] = 0;

printf("%d->%d\n", adjVex[k], k); //adjVex可以知道相关节点前后关系

// 把符合条件的与新根节点(行)有关的边、节点信息更新到数组,供下一轮查找

for (j=1; j

if (lowcost[j] != 0 && graph.arc[k][j] < lowcost[j]) {

lowcost[j] = graph.arc[k][j];

adjVex[j] = k; // 只要找到的更新其前节点为k;

}

}

}

}

void create(PGRAPH g)

{

int i, j;

g->numVex = 9;

// 创建顶点

g->vexs[0] = 'A';

g->vexs[1] = 'B';

g->vexs[2] = 'C';

g->vexs[3] = 'D';

g->vexs[4] = 'E';

g->vexs[5] = 'F';

g->vexs[6] = 'G';

g->vexs[7] = 'H';

g->vexs[8] = 'I';

// 初始化边表

for (i=0; inumVex; i++) {

for (j=0; jnumVex; j++) {

g->arc[i][j] = INFINITY;

if (j == i)

g->arc[i][j] = 0; //行列相等时表示自身,标识为0

}

}

// 添加边及权值

// A v0, B v1, C v2, D v3, E v4, F v5, G v6, H v7, I, v8

g->arc[0][1] = 10;

g->arc[1][0] = 10;

g->arc[0][5] = 11;

g->arc[5][0] = 11;

g->arc[1][2] = 18;

g->arc[2][1] = 18;

g->arc[1][8] = 12;

g->arc[8][1] = 12;

g->arc[1][6] = 16;

g->arc[6][1] = 16;

g->arc[2][8] = 8;

g->arc[8][2] = 8;

g->arc[2][3] = 22;

g->arc[3][2] = 22;

g->arc[3][8] = 21;

g->arc[8][3] = 21;

g->arc[3][6] = 24;

g->arc[6][3] = 24;

g->arc[3][7] = 16;

g->arc[7][3] = 16;

g->arc[3][4] = 20;

g->arc[4][3] = 20;

g->arc[4][7] = 7;

g->arc[7][4] = 7;

g->arc[4][5] = 26;

g->arc[5][4] = 26;

g->arc[5][6] = 17;

g->arc[6][5] = 17;

g->arc[6][7] = 19;

g->arc[7][6] = 19;

}

void gprint(GRAPH graph)

{

int i, j;

for (i=0; i

for (j=0; j

printf("%6d ", graph.arc[i][j]);

}

putchar('\n');

}

}

int main(void)

{

GRAPH graph;

create(&graph);

gprint(graph);

prim(graph);

return 0;

}

output

[root@8be225462e66 c]# gcc prim.c && ./a.out

0 10 65535 65535 65535 11 65535 65535 65535

10 0 18 65535 65535 65535 16 65535 12

65535 18 0 22 65535 65535 65535 65535 8

65535 65535 22 0 20 65535 24 16 21

65535 65535 65535 20 0 26 65535 7 65535

11 65535 65535 65535 26 0 17 65535 65535

65535 16 65535 24 65535 17 0 19 65535

65535 65535 65535 16 7 65535 19 0 65535

65535 12 8 21 65535 65535 65535 65535 0

0->1

0->5

1->8

8->2

1->6

6->7

7->4

7->3

[root@8be225462e66 c]#

标签:prim,16,MAX,C语言,vexs,算法,arc,65535,节点

来源: https://blog.51cto.com/sndapk/2700196

最小生成树实验报告c语言,最小生成树(C语言, prim算法)相关推荐

  1. kuangbin 最小生成树专题 - ZOJ - 1586 QS Network (朴素 Prim算法 模板题)

    kuangbin 最小生成树专题 - ZOJ - 1586 QS Network (朴素 Prim算法 模板题) 总题单 week 3 [kuangbin带你飞] 题单 最小生成树 + 线段树 Cli ...

  2. 最小生成树实验报告c语言,算法与程序设计实验最小生成树(c语言).ppt

    算法与程序设计实验最小生成树(c语言).ppt 最小生成树 问题分析: 由于在每两个城市之间都可以建立一条通信线路,n个城市之间最多可能设置n(n-1)/2条线路,而每条线路都要付出一定的经济代价,因 ...

  3. 最小生成树实验报告c语言,c语言最小生成树的实现

    1.最小生成树介绍 什么是最小生成树? 最小生成树(Minimum spanning tree,MST)是在一个给定的无向图G(V,E)中求一棵树T,使得这棵树拥有图G中的所有顶点,且所有边都是来自图 ...

  4. 厦门理工C语言实验报告8,厦门理工c语言数据结构实验

    <厦门理工c语言数据结构实验>由会员分享,可在线阅读,更多相关<厦门理工c语言数据结构实验(15页珍藏版)>请在人人文库网上搜索. 1.数据结构实验报告 实验序号:6 实验项目 ...

  5. 南工程c语言实验报告,Linux环境下-C语言编程实验报告(1)(总4页).doc

    Linux环境下-C语言编程实验报告(1)(总4页).doc 西 安 邮 电 大 学 (计算机学院)课内实验报告实验名称 Linux环境下 C语言编程 专业名称 网络工程班 级 1203班 学生姓名 ...

  6. c语言实验报告上理答案,C语言实验报告江西理工大学实验5

    <C语言实验报告江西理工大学实验5>由会员分享,可在线阅读,更多相关<C语言实验报告江西理工大学实验5(6页珍藏版)>请在读根文库上搜索. 1.C语言程序设计实验报告教学班级: ...

  7. 大一上期c语言实验报告2,大一上期C语言实验报告1熟悉实验环境

    <大一上期C语言实验报告1熟悉实验环境>由会员分享,可在线阅读,更多相关<大一上期C语言实验报告1熟悉实验环境(3页珍藏版)>请在人人文库网上搜索. 1.成都工业学院计算机工程 ...

  8. 湖北理工学院c语言实验报告答案,湖北理工学院c语言实验报告七答案.doc

    湖北理工学院c语言实验报告七答案.doc 实验七 结构体和共用体实验课程名高级语言程序设计(C)专业班级 学号 姓名 实验时间 实验地点 指导教师 一.实验目的和要求1. 掌握结构体类型变量的定义和使 ...

  9. 大一c语言实验报告运行结果,大一c语言实验报告

    篇一:大一上期C语言实验报告3 基本输入输出 成都工业学院·计算机工程学院 <程序设计基础>实验报告 1. 实验目的 (1) 熟练掌握scanf()/printf()库函数的调用格式,正确 ...

  10. 天津理工大学c语言实验报告8,天津理工大学-c语言上机报告4.doc

    天津理工大学-c语言上机报告4.doc 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的网址水印. 3 ...

最新文章

  1. vsftpd安装配置
  2. c语言结构体中的ps,练习结构体的时候出错,(ps有两个函数还没写)
  3. 再谈序列化推荐-集成item类目属性
  4. 2017 多校2 hdu 6053 TrickGCD
  5. 到底什么是跨域?附解决方案
  6. HTTP 协议 -- 浏览器缓存机制
  7. 提升开发效率的十个工具
  8. 在c语言程序中 对文件进行操作首先要,《C语言程序设计》试题八及答案
  9. RMAN CATALOG命令手动注册磁带库中的备份片
  10. VS2013 + Qt 提示 There‘s no Qt version assigned to this project for platform Win32
  11. Java Base64与图片互转操作测试
  12. 媒体查询加上rem实现页面字体大小自适应
  13. cad补全三视图_cad补画三视图练习题.doc
  14. FTP Server端的使用
  15. touch.pageX/touch.screenX/touch.clientX的区别
  16. 盘古石杯电子取证比赛WP
  17. F2FS源码分析-1.6 [F2FS 元数据布局部分] Segment Summary Area-SSA结构
  18. 【面试题】概率题总结(随机数、抛硬币)
  19. https://geewu.gitbooks.io/rabbitmq-quick/content/RabbitMQ%E5%9F%BA%E7%A1%80%E6%93%8D%E4%BD%9C.html
  20. 轮滑基础(一)(前摔,葫芦步,推步,A字转弯,弓步转弯)

热门文章

  1. 【PAT乙级】1056 组合数的和 (15 分)
  2. Keepalived安装
  3. Java迭代器Iterator
  4. MySQL为关联表添加数据
  5. python远程ftp服务器文件,如何将远程python FTP服务器连接到本地pythonftp客户端
  6. .net bitmap rgb数据_在3D空间,用点云数据学行人重识别特征
  7. 返回值带头信息 php_PHP注释标记的整理
  8. 你真的会正确使用日志吗?
  9. 选择排序算法,只需这篇文章就够了
  10. 查看idea的错误日志信息