博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
最小生成树的基本算法
阅读量:4331 次
发布时间:2019-06-06

本文共 1538 字,大约阅读时间需要 5 分钟。

  • Prim算法

感觉Prim算法找最小生成树的过程像是一个dp的过程,从随便一个点开始,每次都是找到局部最优解,最后就可以找全整个最小生成树。

const int MAXN = 1000;const int LIM = 0x3f3f3f3f;struct MGraph{  int vexs[MAXN];//顶点表  int arc[MAXN][MAXN];//邻接矩阵  int numEdges, numVertexes;//边,点的数量};void MiniSpanTree(MGraph G){  int adjvex[MAXN];  int lowcost[MAXN];//储存每一次延伸后的最小权值  adjvex[0] = 0;  lowcost[MAXN] = 0;//置0代表该点已经加入最小生成树,这里就把0这个点作为起始点  for (int i = 1; i < G.numVertexes; i++)//初始化第一个点延伸出去的边信息  {      lowcost[i] = G.arc[0][i];      adjvex[i] = 0;  }  for (int i = 1; i < G.numVertexes; i++)  {      int mmin = LIM;      int k;      for (int j = 1; j < G.numVertexes; j++)//找到lowcost中的最小边      {          if (lowcost[j] != 0 && mmin > lowcost[j])          {              mmin = lowcost[j];              k = j;          }      }      cout << '(' << adjvex[k] << ',' << k << ')' << endl;//打印最小生成树的边      lowcost[k] = 0;//把该顶点置0      for (int j = 1; j < G.numVertexes; j++)//把下一个顶点的边加入lowcost      {          if (lowcost[j] != 0 && G.arc[k][j] < lowcost[j])          {              lowcost[j] = G.arc[k][j];//更新lowcost              adjvex[j] = k;//找到该点的上一个顶点          }      }  }}
  • Kruskal算法

这个算法就是一个划分集合的过程,运用了并查集的思想,并且保证集合里面不会形成环路。因为已经将边集数组提前进行从小到大的排序,所以每次加进集合的都可以认为是剩下的最优解。

#include
#include
using namespace std;const int MAXN = 1000;struct Edge//边集数组{ int begin; int end; int weight;};struct Graph//图{ Edge edges[MAXN]; int numVertexes,numEdges;};bool cmp(Edge a,Edge b)//定义比较函数,从小到大排序{ return a.weight

转载于:https://www.cnblogs.com/JMWan233/p/11485722.html

你可能感兴趣的文章
QTcpSocket的连续发送数据和连续接收数据
查看>>
使用Gitbook来编写你的Api文档
查看>>
jquery扩展 $.fn
查看>>
Markdown指南
查看>>
influxDB的安装和简单使用
查看>>
JPA框架学习
查看>>
JPA、JTA、XA相关索引
查看>>
机器分配
查看>>
php opcode缓存
查看>>
springcloud之Feign、ribbon设置超时时间和重试机制的总结
查看>>
Go 结构体
查看>>
LINQ巩固
查看>>
观看杨老师(杨旭)Asp.Net Core MVC入门教程记录
查看>>
UIDynamic(物理仿真)
查看>>
Windows下安装Redis
查看>>
迷宫实现
查看>>
【字符编码】Java字符编码详细解答及问题探讨
查看>>
学习操作系统导图
查看>>
在线的JSON formate工具
查看>>
winform非常实用的程序退出方法!!!!!(转自博客园)
查看>>