图实验报告.docx

上传人:b****3 文档编号:26453960 上传时间:2023-06-19 格式:DOCX 页数:12 大小:25.99KB
下载 相关 举报
图实验报告.docx_第1页
第1页 / 共12页
图实验报告.docx_第2页
第2页 / 共12页
图实验报告.docx_第3页
第3页 / 共12页
图实验报告.docx_第4页
第4页 / 共12页
图实验报告.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

图实验报告.docx

《图实验报告.docx》由会员分享,可在线阅读,更多相关《图实验报告.docx(12页珍藏版)》请在冰豆网上搜索。

图实验报告.docx

图实验报告

实验7二叉树

学生姓名:

蒋瑶瑶

实验日期:

2011-12-13

实验任务:

(1)对图进行深度优先遍历或广度优先遍历;

(2)采用prime算法或Kruscal算法求解最小生成树.

实验源程序:

(1)对图进行深度优先遍历或广度优先遍历;

#defineMAXV10000

#defineMAX_VERTEX_NUM40

#defineMAX40

#include

#include

#include

//图的邻接表存储

typedefstructArCell

{

intadj;

}ArCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

typedefstruct

{

charname[20];

}infotype;

typedefstruct

{

infotypevexs[MAX_VERTEX_NUM];

AdjMatrixarcs;

intvexnum,arcnum;

}MGraph;

 

intLocateVex(MGraph*G,char*v)

{intc=-1,i;

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

if(strcmp(v,G->vexs[i].name)==0)

{c=i;break;}

returnc;

}

//初始化图,接受用户输入

MGraph*CreatUDN(MGraph*G)

{

inti,j,k,w;

charv1[20],v2[20];

printf("请输入图的顶点数和弧数:

");

scanf("%d,%d",&G->vexnum,&G->arcnum);

printf("请依次输入图的顶点\n");

for(i=0;ivexnum;i++){

printf("G.vexs[%d]:

",i);

scanf("%s",G->vexs[i].name);

getchar();

}

for(i=0;ivexnum;i++)//初始化邻接矩阵

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

G->arcs[i][j].adj=MAXV;

for(k=0;karcnum;k++)//构造邻接矩阵

{

printf("第%d条边:

\n",k+1);

printf("起始结点:

");

scanf("%s",v1);

printf("结束结点:

");

scanf("%s",v2);

printf("边的权值:

");

scanf("%d",&w);

i=LocateVex(G,v1);

j=LocateVex(G,v2);//确定v1和v2在G中位置

if(i>=0&&j>=0){

G->arcs[i][j].adj=w;

G->arcs[j][i]=G->arcs[i][j];//置的对称弧

}

}

returnG;

}

intFirstAdjVex(MGraph*G,intv)

{

inti;

if(v>=0&&vvexnum)

{

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

if(G->arcs[v][i].adj!

=MAXV)

{returni;break;}

}

return-1;

}

voidVisitFunc(MGraph*G,intv)

{

printf("%s",G->vexs[v].name);

}

intNextAdjVex(MGraph*G,intv,intw)

{

intk;

if(v>=0&&vvexnum&&w>=0&&wvexnum)

{

for(k=w+1;kvexnum;k++)

if(G->arcs[v][k].adj!

=MAXV)

{returnk;break;}

}

return-1;

}

intvisited[MAX];

voidDFS(MGraph*G,intv)//从第v个顶点出发递归地深度优先遍历图G

{

intw;

visited[v]=1;

VisitFunc(G,v);

for(w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w))

if(!

visited[w]){

DFS(G,w);

}

}

//深度优先遍历

voidDFSTraverse(MGraph*G,char*s)

{intv,k;

for(v=0;vvexnum;v++)

visited[v]=0;

k=LocateVex(G,s);

if(k>=0&&kvexnum){

for(v=k;v>=0;v--){

if(!

visited[v])

DFS(G,v);}

for(v=k+1;vvexnum;v++)

if(!

visited[v])

DFS(G,v);

}

}

typedefstructQNode{

intdata;

structQNode*next;

}QNode,*Queueptr;

typedefstruct{

Queueptrfront;

Queueptrrear;

}LinkQueue;

intInitQueue(LinkQueue&Q){

Q.front=Q.rear=(Queueptr)malloc(sizeof(QNode));

if(!

Q.front)exit(-1);

Q.front->next=NULL;

return1;

}

intEnQueue(LinkQueue&Q,inte){

Queueptrp;

p=(Queueptr)malloc(sizeof(QNode));

if(!

p)exit(-1);

p->data=e;p->next=NULL;

Q.rear->next=p;

Q.rear=p;

return1;

}

intDeQueue(LinkQueue&Q,int&e){

Queueptrp;

if(Q.front==Q.rear)return(-1);

p=Q.front->next;

e=p->data;

Q.front->next=p->next;

if(Q.rear==p)Q.rear=Q.front;

free(p);

return1;

}

intQueueEmpty(LinkQueueQ)

{

if(Q.rear==Q.front)

return1;

return0;

}

intVisited[MAX];

voidmain()

{

MGraph*G,b;

charv[10];

G=CreatUDN(&b);

printf("请输入开始遍历的起始结点名称:

");

scanf("%s",v);

printf("\n深度优先遍历(输出结点序列):

\n");

DFSTraverse(G,v);

printf("\n");

}

(2)采用prime算法或Kruscal算法求解最小生成树.

#defineINFINITY65535

typedefintstatus;

#include

#include

#include

#include"string.h"

#definemaxlen10

typedefstruct

{

charvexs[maxlen][maxlen];/*顶点信息集合,我们用它来存入顶点名字*/

intvexnum,arcnum;/*顶点数和边数*/

intarcs[maxlen][maxlen];/*邻接矩阵*/

}graph;

//定位输入节点的名称

intLocateVex(graphG,charu[maxlen])

{

inti;

for(i=0;i

if(strcmp(u,G.vexs[i])==0)

returni;

return-1;

}

voidprim(graph&g)/*最小生成树*/

{

inti,j,k,min,w,flag;

intlowcost[maxlen];/*权值*/

intcloset[maxlen];/*最小生成树结点*/

charva[maxlen],vb[maxlen];

g.vexnum=6;

g.arcnum=10;

printf("请输入顶点名称:

\n");

for(j=0;j

scanf("%s",g.vexs[j]);

for(i=0;i

for(j=0;j

{

g.arcs[i][j]=INFINITY;//任意两个顶点间距离为无穷大。

}

g.arcs[0][1]=6;

g.arcs[1][0]=6;

g.arcs[0][2]=1;

g.arcs[2][0]=1;

g.arcs[0][3]=5;

g.arcs[3][0]=5;

g.arcs[1][2]=5;

g.arcs[2][1]=5;

g.arcs[1][4]=3;

g.arcs[4][1]=3;

g.arcs[2][3]=5;

g.arcs[3][2]=5;

g.arcs[2][4]=6;

g.arcs[4][2]=6;

g.arcs[2][5]=4;

g.arcs[5][2]=4;

g.arcs[3][5]=2;

g.arcs[5][3]=2;

g.arcs[4][5]=6;

g.arcs[5][4]=6;

printf("最小生成树的边为:

\n");

for(i=1;i

{

lowcost[i]=g.arcs[0][i];

closet[i]=1;

}

closet[0]=0;//初始v1是属于集合U的,即设它是最小生成树中节点的一员

j=1;//V是顶点集合

for(i=1;i

{

min=lowcost[j];

k=i;

for(j=1;j

if(lowcost[j]

=0)

{

min=lowcost[j];

k=j;

}

if(i==1)flag=0;

elseflag=closet[k];

closet[k]=0;

printf("(%s,%s),",g.vexs[k],g.vexs[flag]);

for(j=1;j

if(g.arcs[k][j]

=0)

{

lowcost[j]=g.arcs[k][j];

closet[j]=k;

}

}

}

voidmain()

{

graphg;

prim(g);

printf("\n");

}

实验结果截图:

(1)对图进行深度优先遍历或广度优先遍历;

(2)采用prime算法或Kruscal算法求解最小生成树.

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 人力资源管理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1