图实验报告.docx
- 文档编号:8695519
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:14
- 大小:73.91KB
图实验报告.docx
《图实验报告.docx》由会员分享,可在线阅读,更多相关《图实验报告.docx(14页珍藏版)》请在冰豆网上搜索。
图实验报告
闽江学院电子系
实验报告
学生姓名:
班级:
学号:
课程:
算法与数据结构
一、实验题目:
:
图及其应用
一、实验地点:
实验楼A210
-实验目的:
熟练掌握图的两种存储结构(邻接矩阵和邻接表)的表示方法掌握图的基本运算及应用
加深对图的理解,逐步培养解决实际问题的编程能力
三、实验内容:
.采用邻接表或邻接矩阵方式存储图,实现图的深度遍历和广度遍历;
.用广度优先搜索方法找出从一顶点到另一顶点边数最少的路径;
•图的存储结构的转换。
四、实验环境(使用的软硬件):
VisualC++集成开发环境
五、实验步骤及操作
1•启动VC++;
2.新建工程/Win32ConsoleApplication,选择输入位置:
输入工程的名称:
tu;
按"确定”按钮,选择"AnEmptyProject”,再按"完成”按钮,
3.新建文件/C++SourceFile,选中“添加到工程的复选按钮”,输入文件名“1.cpp”,按“确定”
按钮,在显示的代码编辑区内输入如下的参考程序:
#include
#include
#defineInfinity1000
#defineMAX20
typedefstruct{
intvexnum;//
顶点数目
intarcnum;//
弧数目
charvexs[MAX];
//
顶点向量
intarcs[MAX][MAX];
//
邻接矩阵
charkind;//
图的种类:
有向图D,无向图U
}MGraph;
//图的建立
MGraphCreat_MGraph(){
MGraphG;
charv1,v2;
printf("请输入图的种类(有向图(D),无向图(U)!
\n");
scanf("%c",&G.kind);
printf("请输入顶点数目和弧数目!
\n");
scanf("%d%d",&G.vexnum,&G.arcnum);
G.arcs[j][k]=w;
if(G.kind=='U')
getchar();
for(i=0;i scanf("%c",&G.vexs[i]); getchar(); for(i=0;i scanf("%c%c%d",&v1,&v2,&w); getchar(); G.arcs[k][j]=w; } returnG; } intvisited[MAX];//标志数组,显示是否遍历 //递归深度遍历调用函数 voidDFS(MGraphG,inti){ intj; visited[i]=1; printf(”%c”,G.vexs[i]); for(j=0;j visited[j]&&G.arcs[i][j] DFS(G,j); } //深度遍历函数 voidM_DFSTraverse(MGraphG){ inti; printf("深度遍历图结果如下: \n"); for(i=0;i visited[i]=0; for(i=0;i if(! visited[i]) DFS(G,i); printf("\n"); } //广度遍历函数 voidM_BFSTraverse(MGraphG){ inti,j,k,Q[MAX],w; j=k=0; printf(”广度遍历图结果如下: \n"); for(i=0;i visited[i]=0; for(i=0;i visited[i]=1; printf(”%c”,G.vexs[i]); Q[k++]=i; while(j! =k){ j++; for(w=0;w visited[w]&&G.arcs[j][w] printf("%c",G.vexs[w]);Q[k++]=w; } } } printf("\n"); } //最小生成树函数,对无向图适用 voidMiniSpanTree_PRIM(MGraphG,charu){ charadjvex[MAX]; intlowcost[MAX]; inti,j,k=0,min; printf("图的最小生成树为: \n"); while(G.vexs[k]! =u)k++; for(i=0;i if(i! =k){ adjvex[i]=u; lowcost[i]=G.arcs[k][i]; } lowcost[k]=0; for(i=0;i min=lnfinity; for(j=0;j if(lowcost[j]&&lowcost[j] min=lowcost[j]; k=j; } printf("%c--(%d)--%c\n",adjvex[k],lowcost[k],G.vexs[k]);lowcost[k]=0; for(j=0;j if(G.arcs[k][j] adjvex[j]=G.vexs[k];lowcost[j]=G.arcs[k][j]; } } } //求最短路径的函数,对有向图适用 voidShortestPath_DIJ(MGraphG,charu){ intP[MAX][MAX],//二维数组,标志最短路径上的点 D[MAX],//记录最短路径的长度 final[MAX],//标志是否求的它的最短路径 i,j,v,w,v0,min; v0=0; while(G.vexs[vO]! =u)v0++; for(v=0;v D[v]=G.arcs[vO][v]; final[v]=0; for(w=0;w P[v][w]=0; if(D[v] P[v][v0]=1;P[v][v]=1; } } D[v0]=0;final[v0]=1; for(i=1;i min=lnfinity; for(w=0;w if(! final[w]) if(D[w] v=w;min=D[w]; } final[v]=1; for(w=0;w if(! final[w]&&(min+G.arcs[v][w] D[w]=min+G.arcs[v][w]; for(j=0;j P[w][j]=P[v][j]; P[w][w]=1; } } printf(”从已知点到其他各点的最短路径为: \n"); for(v=0;v if(final[v]){ printf("%c--%c的最短路径长度为%d,路径为: ”,u,G.vexs[v],D[v]); for(w=0;w if(P[v][w]) printf("%c",G.vexs[w]); printf("\n"); } } voidmain(){ MGraphG; G=Creat_MGraph(); M_DFSTraverse(G); M_BFSTraverse(G); if(G.kind=='U') MiniSpanTree_PRIM(G,'a');//无向图就求它的最小生成树 else ShortestPath_DIJ(G,'a');//有向图就求它的最短路径 } 4.按F7键,或工具图标进行工程的建立,如有错误,根据错误显示区中的提示,改正错误,重新建立应用程序; 5.按Ctrl+F5键,或工具图标进行工程的执行。 6.新建工程/Win32ConsoleApplication,选择输入位置: 输入工程的名称: 图的存储结构转换; 按"确定”按钮,选择"AnEmptyProject”,再按"完成”按钮, 7.新建文件/C++SourceFile,选中“添加到工程的复选按钮”,输入文件名“1.cpp”,按“确定” 按钮,在显示的代码编辑区内输入如下的参考程序: #include #include #defineMAX5 #defineINF100000 intvisit[MAX]={0}; typedefstructmgraph { intedges[MAX][MAX]; intn,e; }MGraph; typedefstructnode { intadjvex; structnode*nextarc; }ArcNode; typedefstructVnode { ArcNode*firstarc; }VNode; typedefstructalgraph { VNodeadjlist[MAX]; intn,e; }ALGraph; voidMtoAL(MGraphmg,ALGraph*&alg) { inti,j,n=mg.n; ArcNode*p; alg=(ALGraph*)malloc(sizeof(ALGraph)); for(i=0;i alg->adjlist[i].firstarc=NULL; for(i=0;i { for(j=n_1;j>=0;j__) { if(mg.edges[i][j]! =O) { p=(ArcNode*)malloc(sizeof(ArcNode)); p->adjvex=j; p->nextarc=alg->adjlist[i].firstarc; alg->adjlist[i].firstarc=p; } } alg->n=mg.n; alg->e=mg.e; } } voidALtoM(ALGraph*alg,MGraph&mg) { inti=0,n=alg->n; ArcNode*p; for(i=0;i { p=alg->adjlist[i].firstarc; while(p) { mg.edges[i][p->adjvex]=1; p=p->nextarc; } } mg.n=alg->n; mg.e=alg->e; } voidPrintMGraph(MGraphmg) { for(inti=O;i { for(intj=O;j printf("%-3d",mg.edges[i][j]); printf("\n"); } printf("thenumofedgeis: %-3d\n",mg.e); printf("thenumofvertexis: %-3d\n",mg.n); } voidPrintALGraph(ALGraph*alg) { for(inti=0;i { if(alg->adjlist[i].firstarc) { printf("vertex[%d]: ",i); ArcNode*p=alg->adjlist[i].firstarc; while(p) { printf("%-3d",p->adjvex); p=p->nextarc; } } printf("\n"); } } voidmain() { MGraphmg; ALGraph*alg; mg.n=5;mg.e=6; intpath[MAX]; inta[MAX][MAX]={{0,1,0,1,0},{1,0,1,0,0},{0,1,0,1,1},{1,0,1,0,1},{0,0,1,1,0}}; inti,j; for(i=0;i 请输入图的种类(石向图(D)「无向图(U)! 壽输入顶点数目和弧数目? 8 请输入各个顶点冷址)! ahcdefgh 谙输入第<1>条弧的起始点和它的权重(ccd)* ab4 请薪入第<2>条弧的起始点和它的权重(ccd)! 请输入第⑶条酬的起始点和它的权重(ecd)*bd& 请输入第⑷杀弧的起始点和它的权重O♦cd£ 惰输入第0条弧的起始点和它的权重(心), T 请输入第<&>条弧的起始点和它的取重("<0$请输入第S条弧的起始点和它的权重(“d.i•de? 请输入第<9>条弧的起始点和它的权重(ccd)*请输入第如条弧的起始点和它的权董(ccd)r d<j5 请输入第<10>条弧的趣台点和它的权重3皿)? dli4 请输入第<11>条弧的起始点和它的权重(ccd)! i書输入第<12>条弧的起贻点和它的权重Ceci)tfg2 请输人羊C13>条弧的起始点和它的权董(cud)f hb=二g9Qi _u±-nJD4s-Hf眉廿JJJo-y」VI? VI一日-iI343ff4381118帳为为为为为为为为<.・乜口山詢度度度度度度度度01叮 主#-a^-R=H-R=DW=口12二口兰cd古勺,^勺勺勺勺_r""Td^TT-ft! rfnm-fTTJnr-^TTrrnnnah 从a—_ abode-------- gh& (2)有向图 『输入图的种类(有回图5)■无冋图(u)! 岛输入顶点数目和弧数引 5 7 请输入各个顶点(abc)! cibctle请输入第able请输入第aclS请输入第cbS请输入第bd5儲输入第4c2幘输入第『青输入第 <1> <2> <3> <4> <5> <7> 条弧的起始点和它的权重 条弧的起始点和它的权重 条弧的起始点和它的权重 条弧的起始点和它的权重条弧的起始点和它的权重条弧的起始点和它的权重条弧的起始点和它的权重 餐度遍历图结果如下: 广釐遍历图结果如云ad从已规翹其卜一a的愍短務 h的更;担的 F憾觀1层 si 也奇点的最短路径为;牡度为10,路仝为 徉度为1? 路轻为程长度为17,略宦为 (3)图的存储结构的转换 (ccd) (ccdJ (ccd) (ccd.) (ccd.) (ccd) (ccd) ad ab ab ab
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 报告