最小生成树的几个算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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) {