数据结构实验报告 最小生成树

  • 格式:doc
  • 大小:26.00 KB
  • 文档页数:3

实验报告六

(数学学院08级4班 080204015 余燕川)

实验目的:

通过对图的基本知识的学习, 掌握图的基本概念, 构造最小生成树, 在此基础上上机实践, 调试程序。

实验题目:

对一个给定的图G(V, E), 构造最小生成树。

三、实验分析:

1.假设网G(V, E)是连通的, 从顶点u出发构造G的最小生成树T, 开始时, 记T=(U, B), 其中U是T顶点集合, B是T的边集合;

2、开始时U={u0 }( u0 ∈V)B=空,重复执行下述操作:在所有的u ∈U,V∈V-U组成的边(u,v)中找出一条权值最小的边(u0,v0)并入边集B中,同时将v0加入顶点集U,直到U=V为止, 此时T中必中必有n-1条边, 则T=(U, B)为G的最小生成树。

四、实验部骤:

(1)构写程序的大体框架;

(2)具体编写每个操作的程序;

(3)程序的检查;

(4)程序的调试;

五、程序调试问题:

输入顶点后, 边的信息输不进去;如下图:

六、实验结果:

输入顶点数为5, 边数为8, 顶点为v1,v2,v3,v4,v5;后面出现了问题。

七、实验程序:

#define MAXSIZE 100

#define max 10

typedef char datatype;

typedef struct

{

datatype vexs[MAXSIZE];

int edges[MAXSIZE][MAXSIZE]; int n,e;

}graph;

struct{

char end;

int len;

}minedge[max];

void Creatgraph(graph *ga)

{int i,j,k,w;

printf("Please put the number of graph's vexs and edges:");

scanf("%d,%d",&(ga->n),&(ga->e));

printf("shu rui ding dian:\n");

for(i=0;in;i++)

scanf("%2c\n",&(ga->vexs[i]));

for(i=0;in;i++)

for(j=0;jn;j++)

ga->edges[i][j]=100;

for(k=0;ke;k++)

{

printf("shu rui %d tiao bian de xu hao i,j and quan zhi w:",k+1);

scanf("%d,%d,%d\n",&i,&j,&w);

ga->edges[i][j]=w;

ga->edges[j][i]=w;

}

}

void prim(graph *g,char u)

{

int v,k,j=0,min;

for (v=1;v<=g->n;v++)

if(v!=u)

{minedge[v].end=u;

minedge[v].len=g->edges[v][u];

}

minedge[u].len=0;

for(k=1;kn;j++)

{min=minedge[k].len;

v=j;

}

if(min==MAXSIZE)

{

printf("error!");

}

printf("zui xiao sheng cheng shu:");

printf("%d %d",v,minedge[v].end); minedge[v].len=-minedge[v].len;

for(j=1;j<=g->n;j++)

if(g->edges[j][v]

{

minedge[j].len=g->edges[j][v];

minedge[j].end=v;

}

}

void main()

{int i,j;

graph *g;

g=(graph *)malloc(sizeof(graph));

Creatgraph(g);

printf("Sheng cheng shu:\n");

prim(g,g->vexs[0]);

}