第六章图-算法6.8普里姆算法

代码实现

#pragma once
#include <iostream>using namespace std;//图的邻接矩阵存储(创建无向图)
//表示极大值
#define MaxInt 32767
//最大顶点数
#define MVNum 100
//顶点类型
typedef char VerTexType;
//边上的权值类型
typedef int ArcType;typedef struct
{//顶点表VerTexType vexs[MVNum];//邻接矩阵ArcType arcs[MVNum][MVNum];//图中当前顶点数和边数int vexnum, arcnum;
}AMGraph;//图G中查找顶点u,返回下标;不存在返回-1
int LocateVex(AMGraph G, VerTexType v)
{int i;for (i = 0; i < G.vexnum; i++){if (v == G.vexs[i]){return i;}}
}void CreateUDN(AMGraph& G)
{VerTexType v1, v2;ArcType w;int row;int col;//输入总顶点数,总边数cout << "请输总顶点数:";cin >> G.vexnum;cout << "请输总边数:";cin >> G.arcnum;//依次输入点的信息for (int i = 0; i < G.vexnum; i++){cout << "输入顶点:";cin >> G.vexs[i];}//初始化邻接矩阵,边的权值置为最大值MaxIntfor (int m = 0; m < G.vexnum; m++){for (int n = 0; n < G.vexnum; n++){G.arcs[m][n] = MaxInt;}}//构造邻接矩阵for (int k = 0; k < G.arcnum; k++){cout << "输入边依附的顶点以及权值:";cin >> v1 >> v2 >> w;row = LocateVex(G, v1);col = LocateVex(G, v2);G.arcs[row][col] = w;G.arcs[col][row] = G.arcs[row][col];}
}//输出无向网的邻接矩阵
void ShowGraph(AMGraph G)
{cout << "无向网的邻接矩阵为:" << endl;for (int i = 0; i < G.vexnum; i++){for (int j = 0; j < G.vexnum; j++){if (G.arcs[i][j]==MaxInt){cout << "∞" << " ";}else{cout << G.arcs[i][j] << " ";}}cout << endl;}}//辅助数组的定义,用来记录顶点U到V-U的权值最小的边
struct
{VerTexType adjvex;//最小边在U中的那个顶点ArcType lowcost;//最小边上的权值
}closedge[MVNum];//返回权值最小的点
int Min(AMGraph G)
{int minnum = INT_MAX;int index;for (int i = 0; i < G.vexnum; i++){if (closedge[i].lowcost < minnum&&closedge[i].lowcost!=0){minnum = closedge[i].lowcost;index = i;}}return index;
}void MiniSpanTree_Prim(AMGraph G, VerTexType u)
{//K为顶点u的下标int k = LocateVex(G, u);//初始化for (int j = 0; j < G.vexnum; j++){if (j != k){closedge[j] = { u,G.arcs[k][j] };}}closedge[k].lowcost = 0;//选择其余n-1个顶点,生成n-1条边VerTexType u0, v0;for (int i = 1; i < G.vexnum; i++){k = Min(G);//u0为最小边的一个顶点,u0∈U u0 = closedge[k].adjvex; //v0为最小边的另一个顶点,v0∈V-U v0 = G.vexs[k];                     //输出当前的最小边(u0, v0)              cout << "边  " << u0 << "--->" << v0 << endl;         //第k个顶点并入U集       closedge[k].lowcost = 0;            for (int j = 0; j < G.vexnum; j++)//新顶点并入U后重新选择最小边 if (G.arcs[k][j] < closedge[j].lowcost) {                      closedge[j].adjvex = G.vexs[k];closedge[j].lowcost = G.arcs[k][j];} }}int main() {AMGraph G;//创建无向网的邻接矩阵CreateUDN(G);//输出无向网的邻接矩阵ShowGraph(G);cout << "******利用普里姆算法构造最小生成树结果:******" << endl;MiniSpanTree_Prim(G, '1');cout << endl;system("pause");return 0;
}

运行结果

第六章图-算法6.8普里姆算法相关推荐

  1. 【HDU - 1301】Jungle Roads(并查集+最小生成树)(内附最小生成树两种算法 克鲁斯特尔算法amp;amp;普里姆算法)

    题干: Jungle Roads Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  2. 数据结构(五)图---最小生成树(普里姆算法)

    一:最小生成树 (一)定义 我们把构造连通网的最小代价生成树称为最小生成树或给定一个带权的无向连通图,如何选取一棵生成树,使树上所有边上权的总和为最小,这叫最小生成树. (二)什么是最小生成树? 1. ...

  3. 编程中十大常用算法:(六)普里姆算法(最小生成树)

    背景 修路问题: (1)有七个村庄(A-G),现需要修路把7个村庄连通 (2)各个村庄的距离用边线(权值)表示,例如村庄A到村庄B的距离为5公里 求: 如何修路保证各个村庄都能连通,并且总的修建公路总 ...

  4. 数据结构实验-图-普里姆算法、克鲁斯科尔算法

    数据结构实验-图-普里姆算法.克鲁斯科尔算法 (实验)自定义存储结构,并设计程序完成如下功能: ①创建图:创建带权无向图. ②普里姆算法:采用普里姆算法依次输出最小生成树中各条边. ③克鲁斯科尔算法: ...

  5. 我所知道的十大常用算法之普里姆算法(最小生成树)

    前言需求 今天我们学习的是普里姆算法,我们还是从一个场景里引入看看 有7个村庄(A, B, C, D, E, F, G) ,现在需要修路把7个村庄连通 1.各个村庄的距离用边线表示(权) ,比如 A ...

  6. 最小生成树(普里姆算法【Prim】与克鲁斯卡尔算法【Kruskal】)

    写在前面:博主是一位普普通通的19届双非软工在读生,平时最大的爱好就是听听歌,逛逛B站.博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的事,做自己不后悔的事 ...

  7. 【数据结构与算法】普里姆算法的介绍和修路问题程序实现

    目录 1. 最小生成树的介绍 2. 普里姆算法的介绍 3. 修路问题的介绍 1. 最小生成树的介绍 最小生成树(Minimum Cost Spanning Tree),简称MST.给定一个带权的无向连 ...

  8. 普里姆算法解决修路问题

    一 问题提出 1 胜利乡有7个村庄(A, B, C, D, E, F, G),现在需要修路把7个村庄连通. 2 各个村庄的距离用边线表示(权) ,比如 A – B 距离 5公里. 问:如何修路保证各个 ...

  9. Java用普里姆算法(prim)解决修路最短路径问题

    14.6 普里姆算法 14.6.1 应用场景-修路问题 看一个应用场景和问题: 有胜利乡有 7 个村庄(A, B, C, D, E, F, G) ,现在需要修路把 7 个村庄连通 各个村庄的距离用边线 ...

最新文章

  1. Go语言的错误异常处理机制及其应用
  2. 解决uni-app中flex布局子元素宽度溢出
  3. Kettle使用_8 存储过程结合获取系统信息
  4. easyui问题小结
  5. VS静态库和动态库的区别
  6. SQL server中的SELECT查询语句执行顺序
  7. Lua mysql insert 并发数_高并发 Nginx+Lua OpenResty系列(6)——Lua开发库Mysql
  8. php与硬件通过wifi对接,基于ESP8266的WiFi排插接入贝壳互联实现天猫精灵控制
  9. linux mysql配置修改_【Mysql】linux下mysql的配置修改
  10. set python_Python之set的用法(一)
  11. 使用PowerShell 导出Exchange中的用户中用户信息到Office 365
  12. openssl_sign(): supplied key param cannot be coerced into a private key
  13. netron安装使用
  14. C++ 复数计算器 简单代码
  15. python excel数据处理教程pdf_python对excel操作详解.pdf
  16. 非专业python学多久_非的解释|非的意思|汉典“非”字的基本解释
  17. java中函数编程的妙用
  18. 科大讯飞AI营销大赛 CTR预估总结
  19. 如何通过供应链管理来居家做菜?
  20. 《安富莱嵌入式周报》第268期:2022.05.30--2022.06.05

热门文章

  1. vuex状态管理-逆战班
  2. TouchScript如何取消鼠标图标
  3. 解决联合边缘资源面临的挑战
  4. 图的深度优先遍历(DFS)和广度优先遍历(BFS)非递归实现C++
  5. 低油耗、高性价比,过年带这几款车去见丈母娘最好
  6. 3.程序运行模型-计算机体系结构
  7. 如何打开WPS文档的目录?
  8. 停用词扩展-基于点互信息
  9. 微信小程序—for循环包括自定义for循环中的item和index(图文)
  10. 喜马拉雅7天VIP!领取秒到账