最小生成树的几个算法

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

<图>最小生成树的几个算法。

一、Prim 算法:

1、将图中顶点分为两个集合,其中集合X 包含图的一个顶点v0,集合Y 包含除v0 外的其它所有顶点;

2、将跨接这两个集合的权值最小的边加入图中,并将其依附在集合Y 中的顶点v1 从Y 中移入集合X 中;

3、反复过程2,直到集合Y 为空,所得生成子图即为最小生成树。

二、Kruskal 算法:

1、将图中所有边按权值从小到大排序;

2、取权值最小的边,加入图中,判断是否形成了回路,若无,则保留此边,否则去掉该边,重取权值较小的边;

3、反复过程2,直到全部顶点均连通为止。

三、破圈法:

1、在图中找到一个回路;

2、去掉该回路中权值最大的边;

3、反复此过程,直到图中不存在回路为止。

四、去边法:

1、将图中所有边按权值从大到小排序;

2、去掉权值最大的边,若图不再连通则保留此边,再选取下一权值较大的边去掉;

3、反复此过程,直到图中只剩下n-1 条边为止。

下面的程序是实现Prim、去边法、Kruskal算法的。弄好了久好久,出现了很多Bug,很多地方方法也可能不够简。可能还有很多Bug,但先收手了。

第四次上机作业

输入无向图的邻接矩阵,使用前面讲过的任意三种方法求该图的最小代价生成树,并分析各自的时间复杂度。

#include

#include

using namespace std;

/***************************基本上共用的大模块(结构定义,邻接矩阵输入)

************************************/

#define MAX_VERTEX_NUM 20

typedef struct //存放连接矩阵权值的一个结点

{

int weight;

}Adj,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

typedef struct //连接矩阵

{

AdjMatrix arc; //存权值的域

int vexnum; //节点个数

int edge; //边的个数

}MGraph;

typedef struct Node //用链表表示

{

int v1; //v1,v2为边的两个结点

int v2;

int weight;

struct Node *next; //指向下一个结点

}Node;

typedef Node *NODEPTR;

void CreateMGraph(MGraph &M)

{

/*创建一个邻接矩阵表示有权图*/

cout<<"请输入结点的个数:";

cin>>M.vexnum;

M.edge=0;

cout<<"请输入该图的邻接矩阵:"<

{

for(int j=1;j<=M.vexnum;j++)

{

cin>>M.arc[i][j].weight;

if(M.arc[i][j].weight)

M.edge++;

}

}

}

/***********************查找最小生成树的Prim算法**********************************/

struct Closedge

{

int adjvex;

int lowcost;

};

struct Closedge closedge[MAX_VERTEX_NUM];//附设一个辅助数组,以记录从V-U具有最小代价的边。

/*寻找closedeg数组里的最小权值(除去0以外的)*/

int minimun(struct Closedge closedge[],MGraph m)

{

int node=-1,min;

for(int i=1;i<=m.vexnum;i++)

{

if(closedge[i].lowcost!=0)

{

min=closedge[i].lowcost;

node=i;//先找到第一个

break;

}

}

i++;

for(;i<=m.vexnum;i++)//再作比较找更小的

{

if(closedge[i].lowcost!=0&&closedge[i].lowcost

{

min=closedge[i].lowcost;

node=i;

}

}

return node;//返回的是这个最小权值的在closedge的位置,即为下一个归入的结点

}

void print(struct Closedge closedge[],MGraph m)

{ //用来观察closedge数组的变化的

for(int i=1;i<=m.vexnum;i++)

{

cout<<"v="<

for(int j=1;j<=m.vexnum;j++)

{

if(m.arc[u][j].weight)

{

相关文档
最新文档