1、采用书上第 161 页定义的图的邻接矩阵存储表示,编程实现构造最小生成树的 Prim 算法。

2、采用书上第 161 页定义的图的邻接矩阵存储表示,编程实现构造最小生成树的 Kruskal 算法。

例题一(Prim 算法实现):

#include<stdio.h>
#include<stdlib.h>
#include<limits.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define INFINITY INT_MAX
#define MAX_VERTEX_NUM 20
typedef int Status;
typedef int VRType;
typedef int infoType;
typedef enum{DG,DN,UDG,UDN}GraphKind;
typedef struct ArcCell
{VRType adj;infoType* info;
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef char VertexType;
typedef struct
{VertexType vexs[MAX_VERTEX_NUM];AdjMatrix arcs;int vexnum, arcnum;GraphKind kind;
}MGraph;typedef struct {VertexType adjvex;VRType lowcost;
}Closedge[MAX_VERTEX_NUM];int LocateVex(MGraph G, char v)
{int i;for (int i = 0; i < G.vexnum; i++)if (G.vexs[i] == v)    return i;return -1;
}
Status CreateDG(MGraph& G)
{int i, j, k;VertexType v1, v2;printf("输入顶点数G.vexnum: ");     scanf("%d", &G.vexnum);printf("输入边数G.arcnum: ");        scanf("%d", &G.arcnum);getchar();for (i = 0; i < G.vexnum; i++){printf("输入顶点G.vexs[%d]:", i);scanf("%c", &G.vexs[i]);getchar();}for (i = 0; i < G.vexnum; i++)for (j = 0; j < G.vexnum; j++){G.arcs[i][j].adj = 0;G.arcs[i][j].info = NULL;}for (k = 0; k < G.arcnum; k++){printf("输入第%d条边vi、vj:\n", k + 1);scanf("%c %c", &v1, &v2);getchar();i = LocateVex(G, v1);  j = LocateVex(G, v2);G.arcs[i][j].adj = 1;}return OK;
}
Status CreateUDG(MGraph& G)
{int i, j, k;VertexType v1, v2;printf("输入顶点数G.vexnum: ");     scanf("%d", &G.vexnum);printf("输入边数G.arcnum: ");        scanf("%d", &G.arcnum);getchar();for (i = 0; i < G.vexnum; i++){printf("输入顶点G.vexs[%d]:", i);scanf("%c", &G.vexs[i]);getchar();}for (i = 0; i < G.vexnum; i++)for (j = 0; j < G.vexnum; j++){G.arcs[i][j].adj = 0;G.arcs[i][j].info = NULL;}for (k = 0; k < G.arcnum; k++){printf("输入第%d条边vi、vj:\n", k + 1);scanf("%c %c", &v1, &v2);getchar();i = LocateVex(G, v1);  j = LocateVex(G, v2);G.arcs[i][j].adj = 1;G.arcs[j][i].adj = G.arcs[i][j].adj;}return OK;
}
Status CreateUDN(MGraph& G)
{int i, j, k, w;VertexType v1, v2;printf("输入顶点数G.vexnum: ");      scanf("%d", &G.vexnum);printf("输入边数G.arcnum: ");        scanf("%d", &G.arcnum);getchar();for (i = 0; i < G.vexnum; i++){printf("输入顶点G.vexs[%d]:",i);scanf("%c", &G.vexs[i]);getchar();}for(i=0;i<G.vexnum;i++)for (j = 0; j < G.vexnum; j++){G.arcs[i][j].adj = INFINITY;G.arcs[i][j].info = NULL;}for (k = 0; k < G.arcnum; k++){printf("输入第%d条边vi、vj和权值w(int):\n", k + 1);scanf("%c %c %d", &v1, &v2, &w);getchar();i = LocateVex(G, v1);   j = LocateVex(G, v2);G.arcs[i][j].adj = w;G.arcs[j][i].adj = G.arcs[i][j].adj;}return OK;
}
Status CreateDN(MGraph& G)
{int i, j, k, w;VertexType v1, v2;printf("输入顶点数G.vexnum: ");      scanf("%d", &G.vexnum);printf("输入边数G.arcnum: ");        scanf("%d", &G.arcnum);getchar();for (i = 0; i < G.vexnum; i++){printf("输入顶点G.vexs[%d]:", i);scanf("%c", &G.vexs[i]);getchar();}for (i = 0; i < G.vexnum; i++)for (j = 0; j < G.vexnum; j++){G.arcs[i][j].adj = INFINITY;G.arcs[i][j].info = NULL;}for (k = 0; k < G.arcnum; k++){printf("输入第%d条边vi、vj和权值w(int):\n", k + 1);scanf("%c %c %d", &v1, &v2, &w);getchar();i = LocateVex(G, v1);   j = LocateVex(G, v2);G.arcs[i][j].adj = w;}return OK;
}
Status CreateGraph(MGraph& G)
{printf("请输入图的种类:0表示DG,1表示DN,2表示UDG,3表示UDN\n");scanf("%d", &G.kind);switch (G.kind){case DG:return CreateDG(G);case DN:return CreateDN(G);case UDG:return CreateUDG(G);case UDN:return CreateUDN(G);default:return ERROR;}
}
void list(MGraph G)
{int i, j;printf("输出邻接矩阵:\n");for (i = 0; i < G.vexnum; i++){printf("%c----", G.vexs[i]);for (j = 0; j < G.vexnum; j++)if (G.arcs[i][j].adj == INFINITY){printf("%4s", "∞"); }elseprintf("%4d", G.arcs[i][j].adj);printf("\n");}
}
Status minimum(MGraph G,Closedge closedge)
{int i, j;double k = 1000;for (i = 0; i < G.vexnum; i++){if (closedge[i].lowcost != 0 && closedge[i].lowcost < k){k = closedge[i].lowcost;j = i;}}return j;
}void MiniSpanTree_PRIM(MGraph G, VertexType u) {int i, j,k;Closedge closedge;k = LocateVex(G, u);for (j = 0; j < G.vexnum; ++j)if (j != k) closedge[j] = { u,G.arcs[k][j].adj };closedge[k].lowcost = 0;for (i = 1; i < G.vexnum; ++i){k = minimum(G,closedge);printf("%c%c ",closedge[k].adjvex, G.vexs[k]);closedge[k].lowcost = 0;for (j = 0; j < G.vexnum;++j) if (G.arcs[k][j].adj < closedge[j].lowcost)closedge[j] = { G.vexs[k],G.arcs[k][j].adj };}}int main()
{MGraph G;CreateGraph(G);list(G);printf("输出最小生成树:\n");MiniSpanTree_PRIM(G, 'A');printf("\n");
}

例题二(Kruskal 算法实现):

#include<stdio.h>
#include<stdlib.h>
#include<limits.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define INFINITY INT_MAX
#define MAX_VERTEX_NUM 20
typedef int Status;
typedef int VRType;
typedef int infoType;
typedef char VertexType;
typedef struct ArcCell
{VRType adj;VertexType start, finish;
}ArcCell, AdjMatrix[MAX_VERTEX_NUM];
typedef struct
{VertexType vexs[MAX_VERTEX_NUM];AdjMatrix arcs;int vexnum, arcnum;
}MGraph;
int LocateVex(MGraph G, char v)
{int i;for (int i = 0; i < G.vexnum; i++)if (G.vexs[i] == v)    return i;return -1;
}
Status CreateGraph(MGraph& G)
{int i, j, k, w;VertexType v1, v2;printf("输入顶点数G.vexnum: ");      scanf("%d", &G.vexnum);printf("输入边数G.arcnum: ");        scanf("%d", &G.arcnum);getchar();for (i = 0; i < G.vexnum; i++){printf("输入顶点G.vexs[%d]:", i);scanf("%c", &G.vexs[i]);getchar();}for (k = 0; k < G.arcnum; k++){printf("输入第%d条边vi、vj和权值w(int):\n", k + 1);scanf("%c %c %d", &v1, &v2, &w);getchar();G.arcs[k].start = v1;    G.arcs[k].finish = v2;G.arcs[k].adj = w;}for (i = 0; i < G.arcnum-1; i++){for (j = i + 1; j < G.arcnum; j++){ArcCell Temp;if (G.arcs[i].adj > G.arcs[j].adj){Temp = G.arcs[i];   G.arcs[i] = G.arcs[j]; G.arcs[j] = Temp;}}}return OK;
}
Status FindStuation(int partern[], int e)
{while (partern[e] != 0){e = partern[e];}return e;
}
Status FinishFind(MGraph& G, int partern[])
{int i, num = 0;for (i = 0; i < G.vexnum; i++){if (partern[i])   num++;}if (num == G.vexnum - 1) return OK;return FALSE;
}
Status MiniSpanTree_Kruskal(MGraph& G)
{int i, sit, hit;int partern[MAX_VERTEX_NUM];for (i = 0; i < G.vexnum; i++){partern[i] = 0;}for (i = 0; i < G.arcnum; i++){sit = FindStuation(partern,LocateVex(G,G.arcs[i].start));hit = FindStuation(partern,LocateVex(G,G.arcs[i].finish));if (sit != hit){partern[sit] = hit;printf("%c%c ", G.arcs[i].start, G.arcs[i].finish);}if(FinishFind(G,partern))   return OK;}
}
int main()
{MGraph G;CreateGraph(G);printf("输出最小生成树:\n");MiniSpanTree_Kruskal(G);printf("\n");
}

图的最小生成树算法实现(Prim + Kruskal)相关推荐

  1. 常用十大算法 非递归二分查找、分治法、动态规划、贪心算法、回溯算法(骑士周游为例)、KMP、最小生成树算法:Prim、Kruskal、最短路径算法:Dijkstra、Floyd。

    十大算法 学完数据结构该学什么?当然是来巩固算法,下面介绍了十中比较常用的算法,希望能帮到大家. 包括:非递归二分查找.分治法.动态规划.贪心算法.回溯算法(骑士周游为例).KMP.最小生成树算法:P ...

  2. 数据结构(19)图的最小生成树算法

    数据结构(19)图的最小生成树算法 前言 普里姆(Prim)算法 克鲁斯卡尔(Kruskal)算法 代码 GraphMtx.h GraphMtx.c Main.c 前言 在有n个顶点的图中,要连接所有 ...

  3. 图的最小生成树算法(图解+代码)| 学不会来看我系列

    文章目录 最小生成树 Prim算法 1.介绍 2.图解步骤 3.算法分析 算法问题 解决方案 4.代码实现 Kruskal算法 1.介绍 2.图解 3.算法分析 算法问题 解决方案 4.代码实现 最小 ...

  4. 【数据结构】——图的最小生成树算法(普里姆+克鲁斯卡尔)

    这里的图指的是带权无向图,也就是无向网. 关于最小生成树 图的最小生成树要解决的问题:用最小的代价连通图中的所有顶点. 下面两种算法都是运用贪心思想,利用MST(Minimum Spanning Tr ...

  5. C++之最小生成树算法(Prim)

    在讲述Prim算法之前让我们先了解一下什么是最小生成树?以下是我摘自维基百科: 最小生成树是一副连通加权无向图中一棵权值最小的生成树.在一给定的无向图 G = (V, E) 中,(u, v) 代表连接 ...

  6. 【数据结构】图的最小生成树算法

    假设你是电信的实施工程师,需要为一个镇的九个村庄架设通信网络做设计,村 庄位置大致如图,其中 Vo-V8是村庄,之间连线的数字表示村与村间的可通达 的直线距离,比如Vo至V1就是10公里(个别如Vo与 ...

  7. 算法:通过克鲁斯卡尔(Kruskal)算法,求出图的最小生成树

    之前我给大家分享过用普利姆(Prim)算法来求出图的最小生成树(点我去看看),今天我再给大家分享一个也是求图的最小生成树的克鲁斯卡尔(Kruskal)算法 克鲁斯卡尔(Kruskal)算法,就相当于先 ...

  8. 技术图文:如何利用C# 实现 Prim 最小生成树算法?

    背景 我们上一篇图文介绍了 如何利用 C# 实现 Kruskal 最小生成树算法?,Kruskal 算法通过寻找边最优的方式来构造最小生成树,本篇图文介绍如何利用 C# 实现 Prim 最小生成树算法 ...

  9. 基于C++的带权无向图的实现 (三)- Prim最小生成树算法

    该系列文章是本人整理的有关带权无向图的数据结构和算法的分析与实现,若要查看源码可以访问我的github仓库,如有问题或者建议欢迎各位指出. 目录 基于C++的带权无向图的实现 (一)- 数据结构 基于 ...

最新文章

  1. 原创 | 一文了解边缘计算和边缘AI
  2. 每天一个linux命令(46):vmstat命令
  3. DELL N系列交换机/N3048交换机SSH配置
  4. 从默认的 _id 字段中,取得时间信息
  5. SAP Fiori element框架template的框架加载逻辑
  6. python openpyxl模块追加数据_python openpyxl模块实现excel的读取,新表创建及原数据表追加新数据...
  7. 神经网络——BP算法
  8. 前端小白,如何快速提升自己?了解3点,找工作不用愁
  9. 互联网思维心得体会1500字_互联网思维心得分享
  10. 报名啦!第四届滴滴-IEEE未来精英论坛今夏来袭
  11. 9款别出心裁的jQuery插件
  12. 电脑的显卡驱动需要更新吗?
  13. Vue + 原生Canvas实现生成电子证书的实践
  14. Robotaxi里程竞赛开启,激光雷达成新热点 | 2021年自动驾驶趋势解读
  15. Unity官方案例噩梦射手开发总结<一> 角色的攻击功能实现
  16. linux开机自启动的几种方法
  17. 〖Python 数据库开发实战 - MySQL篇⑨〗- 什么是 SQL 语言、如何创建数据逻辑库及如何创建数据表
  18. Remix本地化,加载本地合约文件,本地链接Remix
  19. 苏州大学21年计算机考研情况 复试python上机,专硕一志愿平均分376.9分
  20. 随即库 random 常用

热门文章

  1. C++从1~m数字中任取k个元素,求所有组合算法
  2. 深度学习服务器配置过程
  3. SpringSecurity(二) :授权流程
  4. SpringSecurity实现动态鉴权
  5. 分析当当网与京东商城网前端WEB代码
  6. “不差钱”的蔚来,为何着急回港上市?
  7. linux打开浏览器密码取消,Deepin下打开谷歌chrome浏览器提示解锁登录密钥环的解决方法...
  8. Codeup 1814.剩下的树
  9. 什么情况下PMP可自学?
  10. 哪些城市有PMP考试考点?PMP考试考场都在哪?