最小生成树及其算法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
scanf("%d %d",&(G->n),&(G->e)); //输入顶点数,边数
for(i=0;i<G->n;i++)
{
getchar();
printf("\n\t\t请输入第%d个顶点:",i+1);
scanf("%c",&(G->vexs[i])); //输入顶点
}
for(i=0;i<G->n;i++)
printf("\n\t\t请选择菜单号0--1:");
scanf("%d",&choice);
getchar();
switch(choice)
{
case 1: printf("\n\t\tprim算法输出为:");
prim(G,0);break;
本文主要介绍Prim(普里姆)算法及利用。
本文从分析课题的题目背景、题目意义、题目要求等出发,分别从需求分析、总体设计、详细设计、测试等各个方面详细介绍了系统的设计与实现过程,最后对系统的完成情况进行了总结。
关键字:prum算法最小生成树算法比较
1.
最小生成树:连通加权图里权和最小的生成树称为最小生成树。
if(i<=j){
A[k].v1=i;A[k].v2=j;
A[k].cost=G->edgs[i][j];
k++;
}
}
n=0;
while(m<=G->e-1){
min=999;
for(i=n;i<k;i++)
if(A[i].cost<min){
B[n].v1=A[i].v1;B[n].v2=A[i].v2;
//scanf("%c",&a);
//getchar();
// scanf("%c",&b);
m=0;n=0;
for( m=0;G->vexs[m]!=a;m++);
for( n=0;G->vexs[n]!=b;n++);
//printf("\n\t\t请输入权值:");scanf("%d",&weight);
for (i=0;i<G->n;i++) //初始化
{
closedge[i].lowcost=G->edgs[v][i];
closedge[i].adjvex=v;
}
closedge[v].lowcost=TURE;
for (i=1;i<G->n;i++)
{
min=100; /* 100为允许的最大权值*/
vset[vf2]=vset[vf1];}
k++;
}
}
int main(void)
{
MGraph *G,a; char ch1;
int choice;
G=&a;
printf("\n\t\t建立图的邻接矩阵\n");
GreateMGraph(G);
/* printf("\n\t\t已建立一个邻接矩阵!\n");
closedge[j].adjvex=k;
}
}
}
void Kruskal(MGraph *G)
{
int k=0,m=0,n=0;
int vf1,vf2,min,vset[100];
for(int i=0;i<G->n;i++)
for(int j=0;j<G->n;j++)
if(G->edgs[i][j]!=0){
T=(D,R)
其中,D为树中节点的有限集合,关系R满足一下条件:
1)有且仅有一个节点k0属于D,它对于关系R来说没有前趋节点,结点k0称作树的根结点。
2)除根结点k0之外,D中的每个结点仅有一个前趋结点,但可以有过个后继结点。
3)D中可以有多个终端结点。
即除根结点无父结点,其余各结点都有一个父结点和n(n>=0)个子结点。
int n,e;
}MGraph;
struct edg{
int v1;
int v2;
int cost;
}A[10],B[10];
//创建图
void GreateMGraph(MGraph *G)
{
int i,j,k,weight,m,n;
int ch1,ch2;
char a,b;
printf("\n\t\t输入顶点数边数(格式如:3 4):");
ch1=m;ch2=n;
G->edgs[ch1][ch2]=weight;G->edgs[ch2][ch1]=weight;
}
}
void prim(MGraph *G, int v)
{
int i,j,k,min;
struct
{ int adjvex;
int lowcost;
} closedge[10];
for(j=0;j<G->n;j++)
if (closedge[j].lowcost!=TURE && closedge[j].lowcost!=0)
{
if (closedge[j].lowcost<min)
{
min=closedge[j].lowcost;
k=j;
}
}
printf("(%c,%c,%d) ", G->vexs[closedge[k].adjvex], G->vexs[k], min);
2.将v加入集合Vnew中,将(u, v)加入集合Enew中;
4.输出:使用集合Vnew和Enew来描述所得到的最小生成树。
3.prim算法的实现
#include<stdio.h>
#define TURE 999
typedef struct ArcNode
{
char vexs[10];
int edgs[10][10];
图的矩阵表示,本文中只用到了邻接矩阵,故在这只提出邻接矩阵的定义,及其图在邻接矩阵中的表示。
设图A = (V, E)是一个有n个顶点的图,图的邻接矩阵是一个二维数组A.edge[n][n], 用来存放顶点的信息和边或弧的信息。
定义三(邻接矩阵(Adjacency Matrix)):是表示顶点之间相邻关系的矩阵。设G=(V,E)是一个图,其中V={v1,v2,…,vn}。G的邻接矩阵是一个具有下列性质的n阶方阵:(本文主要为无向图的邻接矩阵)
B[n].cost=A[n].cost;
min=A[i].cost;
}
n++;m++;
}
for(i=0;i<G->n;i++){
vset[Biblioteka Baidu]=i;
}
k=0;
while(k<=G->e){
vf1=B[k].v1;vf2=B[k].v2;
if(vset[vf1]!=vset[vf2]){
printf("(%c,%c,%d)",G->vexs[B[k].v1],G->vexs[B[k].v2],B[k].cost);
《离散数学》大作业
论文题目:最小生成树及其算法
院系:电子工程学院
专业:智能科学与技术
学号:
姓名:
二零一一 年 十一 月

连通图广泛应用于交通建设,求连通图的最小生成树是最主要的应用。比如要在n个城市间建立通信联络网,要考虑的是如何保证n点连通的前提下最节省经费,就应用到了最小生成树。
求图的最小生成树有两种算法,一种是Prim(普里姆)算法,另一种是Kruskal(克鲁斯卡尔)算法。
1.输入:一个加权连通图,其中顶点集合为V,边集合为E;
2.初始化:Vnew= {x},其中x为集合V中的任一节点(起始点),Enew= {};
3.重复下列操作,直到Vnew= V:
1.在集合E中选取权值最小的边(u, v),其中u为集合Vnew中的元素,而v则不是(如果存在有多条满足前述条件即具有相同权值的边,则可任意选取其中之一);
closedge[k].lowcost=TURE;
for (j=0;j<G->n;j++)
if (closedge[j].lowcost!=TURE)
if(G->edgs[k][j]<closedge[j].lowcost||closedge[j].lowcost==0 )
{
closedge[j].lowcost=G->edgs[k][j];
for(j=0;j<G->n;j++)
G->edgs[i][j]=0;
for(k=0;k<G->e;k++)
{
//getchar();
printf("\n\t\t请输入第%d条边的顶点权值(格式如:i j):",k+1);
getchar();
scanf("%c %c %d",&a,&b,&weight);
其中,G表示一个图,V是图G中顶点的集合,E是V中顶点偶对的有限集,这些顶点偶对称为边,VertexType是用于描述顶点类型,集合E中P( , )的含义是:对有向图来说用“<>”表示,对无向图来说用“()”表示,即从 到 两个顶点之间存在边。
定义二(树):树包含n(n>=0)个节点。当n=0时表示为空树。其定义如下:
从最小生成树定义看主要先了解图、树及生成树。本文中最小生成树在计算机中存储方法是应用邻接矩阵的形式存储。故也应了解邻接矩阵的定义。
定义一(图):图是有一个非空的顶点集合和一个描述顶点之间的关系即边的集合组成。它可以形式化的定义为:
G=(V,E)
V={ | VertexType}
E={< , >| , ∈V∧P( , )}
(1)无向图的邻接矩阵是对称的;有向图的邻接矩阵可能是不对称的。
(1)无向图的邻接矩阵中第i行第j列表示i结点到j结点的度即权值,可以表示为某一具体应用的数据。也表示i结点是否与j结点连通。
定义四(生成树):如果T是G的一个生成子图又是一棵树,则称T是图G的一棵生成树。
2.prim算法介绍
从单一顶点开始,普里姆算法按照以下步骤逐步扩大树中所含顶点的数目,直到遍及连通图的所有顶点。
printf("\n\t\t**************************");
printf("\n\t\t* 1——prim算法*");
//printf("\n\t\t* 2——kruskal算法*");
printf("\n\t\t* 0——退出*");
printf("\n\t\t**************************");
for(i=0;i<G->n;i++)
{
printf("\n\t\t");
for(j=0;j<G->n;j++)
printf("%5d",G->edgs[i][j]);
}*/
getchar();
ch1=1;
while(ch1==1)
{
printf("\n");
printf("\n\t\t最小生成树" );
相关文档
最新文档