图实验报告.docx
《图实验报告.docx》由会员分享,可在线阅读,更多相关《图实验报告.docx(12页珍藏版)》请在冰豆网上搜索。
图实验报告
实验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;iif(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;jscanf("%s",g.vexs[j]);
for(i=0;ifor(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;jif(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;jif(g.arcs[k][j]=0)
{
lowcost[j]=g.arcs[k][j];
closet[j]=k;
}
}
}
voidmain()
{
graphg;
prim(g);
printf("\n");
}
实验结果截图:
(1)对图进行深度优先遍历或广度优先遍历;
(2)采用prime算法或Kruscal算法求解最小生成树.