图的创建弗洛伊德算法求景点路径.docx

上传人:b****7 文档编号:23640777 上传时间:2023-05-19 格式:DOCX 页数:18 大小:170.52KB
下载 相关 举报
图的创建弗洛伊德算法求景点路径.docx_第1页
第1页 / 共18页
图的创建弗洛伊德算法求景点路径.docx_第2页
第2页 / 共18页
图的创建弗洛伊德算法求景点路径.docx_第3页
第3页 / 共18页
图的创建弗洛伊德算法求景点路径.docx_第4页
第4页 / 共18页
图的创建弗洛伊德算法求景点路径.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

图的创建弗洛伊德算法求景点路径.docx

《图的创建弗洛伊德算法求景点路径.docx》由会员分享,可在线阅读,更多相关《图的创建弗洛伊德算法求景点路径.docx(18页珍藏版)》请在冰豆网上搜索。

图的创建弗洛伊德算法求景点路径.docx

图的创建弗洛伊德算法求景点路径

姓名

黄皓

学号

222014333210004

实验项目

图的创建及应用(V)

实验内容

二、实验内容

校园导游咨询:

编制一个为来访客人进行最短路径导游的程序。

(具体要求见题集第151页5.5)

基本要求:

(1)画出你校的校园平面图,所含景点不少于10个。

以图中顶点表示校内各景点,存放名称、代号、简介等信息;以边表示路径,存放路径长度等相关信息。

(2)为来访客人提供图中任意景点相关信息的查询。

(3)为来访客人提供图中任意景点的路径查询,即查询任意两个景点之间的一条最短的简单路径。

算法分析

用弗洛伊德算法进行路径设置,依据生成的路径表(P)来用函数path()完成景点查询

核心程序

#ifndef_GRAPH3_H

#define_GRAPH3_H

#include

#include

#include

#defineMAX1000

#defineMAXVER9

#defineMAX_EDGE5

/*---邻接矩阵---*/

typedefstructVertex//定义顶点类型

{

charname[20];

intnum;

charintroduction[50];

}VertexType;

typedefstructGraph

{

VertexTypevexs[MAXVER];//顶点表

intarc[MAXVER][MAXVER];//邻接矩阵

intvernum,edgenum,weight;//顶点数量和边数量

}MGraph;

typedefintPathMatrix;

typedefintDistanceMatrix;

intlocate(MGraphG,charna[20]);/*---查询字符的下标---*/

voidCreateMGraph(MGraph*G);

voidshortestPath_FLOYD(MGraphG,PathMatrixP[][20],DistanceMatrixD[20][20]);//弗洛伊德算法

voidpath(MGraphG,PathMatrixP[][20],DistanceMatrixD[][20]);

#endif

#include"graph3.h"

/*---查询顶点的下标---*/

intlocate(MGraphG,charna[20])

{

inti=0;

while(strcmp(G.vexs[i].name,na))//strcmp函数,相同,返回值为0

{

i++;

//printf("sjaskdja");

if(i>MAXVER)

return-1;

}

//printf("\n景点名称:

%s,景点编号:

%d,景点简介:

%s",G.vexs[i].name,G.vexs[i].num,G.vexs[i].introduction);

//printf("shas");

returni;

//for(inti=0;i

}

/*---构建图---*/

voidCreateMGraph(MGraph*G)

{

inti=0;

intj=0;

//intk=MAXVER;

VertexTypev1;

VertexTypev2;

//建立顶点数组

for(i=0;i

{

printf("请输入(景点名字)顶点,代号,简介:

");

do

gets(G->vexs[i].name);

while(!

G->vexs[i].name[0]);

scanf("\n%d\n",&G->vexs[i].num);

gets(G->vexs[i].introduction);

}

//初始化邻接矩阵

for(i=0;i

for(j=0;j

{

if(i==j)

G->arc[i][j]=0;

else

G->arc[i][j]=MAX;

}

for(i=0;i

{

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

}

for(i=0;i

{

printf("\n");

for(j=0;j

{

printf("%d\t",G->arc[i][j]);

}

}

//printf("sjadkjsdkja");

/*---为输入权值---*/

intm=16;

while(m--)//k为顶点数

{

printf("\n请输入两个景点名字(顶点):

");

do

gets(v1.name);//gets读取字符串是不带换行符的,最后是时'\0'

while(v1.name[0]=='\0');

gets(v2.name);

//printf("sjds");

//scanf("\n%s\n%s",&v1.name,&v2.name);

i=locate(*G,v1.name);//得出输入字符的序号,然后在邻接矩阵输入相应信息

while(i==-1)

{

printf("景点名1输入错误,请重新输入:

");

do

gets(v1.name);//gets读取字符串是不带换行符的,最后是时'\0'

while(v1.name[0]=='\0');

i=locate(*G,v1.name);

}

//printf("sdasd");

j=locate(*G,v2.name);

while(j==-1)

{

printf("景点名2输入错误,请重新输入:

");

do

gets(v2.name);//gets读取字符串是不带换行符的,最后是时'\0'

while(v2.name[0]=='\0');

j=locate(*G,v2.name);

}

printf("请输入两个相邻景点之间的路径长度:

");

scanf("\n%d",&G->weight);

G->arc[i][j]=G->weight;

G->arc[j][i]=G->arc[i][j];

}//endwhile

printf("输出邻接矩阵\n");

for(i=0;i

{

printf("%-8s",G->vexs[i].name);//输出景点名称

}

for(i=0;i

{

printf("\n");

for(j=0;j

{

printf("%d\t",G->arc[i][j]);

}

}

}

#include"Graph3.h"

voidshortestPath_FLOYD(MGraphG,PathMatrixP[20][20],DistanceMatrixD[20][20])

{

intv,w,k;

for(v=0;v

for(w=0;w

{

D[v][w]=G.arc[v][w];

P[v][w]=w;

}//for

/*---输出D0---*/

printf("\n输出D0:

");

for(v=0;v

{

printf("\n");

for(w=0;w

{

printf("%d\t",D[v][w]);

}

}

/*---输出P0---*/

printf("\n\n输出P0:

");

for(v=0;v

{

printf("\n");

for(w=0;w

{

printf("%d\t",P[v][w]);

}

}

//intm=0;

for(k=0;k

{

for(v=0;v

{

for(w=0;w

{

if(D[v][w]>D[v][k]+D[k][w])

{

D[v][w]=D[v][k]+D[k][w];

//printf("chenggong");

P[v][w]=P[v][k];

}//endif

else{};

}

}

}//endfor

printf("\n\n输出D8:

");

for(v=0;v

{

printf("\n");

for(w=0;w

{

printf("%d\t",D[v][w]);

}

}

printf("\n\n输出P8:

");

for(v=0;v

{

printf("\n");

for(w=0;w

{

printf("%d\t",P[v][w]);

}

}

/*---输出两个景点的路径以及长度---*/

printf("\n\n");

for(v=0;v

{

for(w=0;w

{

printf("v%d-v%d路径总长:

%d",v,w,D[v][w]);///////////////////////////////

k=P[v][w];

printf("path:

%d",v);

while(k!

=w)

{

printf("->%d",k);

k=P[k][w];

}

printf("->%d\n",w);

}

printf("\n");

}

}

voidpath(MGraphG,PathMatrixP[][20],DistanceMatrixD[][20])

{

charname1[20];

charname2[20];

printf("景点1:

");

do

gets(name1);

while(name1[0]=='\0');

printf("景点2:

");

do

gets(name2);

while(name2[0]=='\0');

printf("%s",name2);

intv,w,k;

v=locate(G,name1);

w=locate(G,name2);

k=P[v][w];

printf("\n从景点(%s)到景点(%s)的路径总长:

%d\n路径:

%s",name1,name2,D[v][w],name1);

while(k!

=w)

{

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

k=P[k][w];

}

}

#include"Graph3.h"

intmain()

{

PathMatrixP[20][20];

DistanceMatrixD[20][20];

inti;

charname[40];

charquit[5]="quit";

//putchar(quit[1]);

MGraphGH;

MGraph*G=&GH;

CreateMGraph(G);

while

(1)

{

//while(getchar()=='\n')

//continue;

printf("\n\n请输入想知道的景点的名字(输入quit退出):

");

do

gets(name);

while(!

name[0]);

//while(name=='\0');

if(strcmp(name,quit)==0)

break;

i=locate(*G,name);

printf("景点名称:

%s\n编号:

%d\n简介:

%s",GH.vexs[i].name,GH.vexs[i].num,GH.vexs[i].introduction);

}

shortestPath_FLOYD(*G,P,D);

printf("从景点A到景点B的最短路径(输入两个景点的代号):

\n");

path(*G,P,D);

//while(scanf("\n%d\n%d",&i,&j)==2)

//这里需要写一个两个景点的最短路径的函数,依据生成的弗洛伊德表来写

return0;

}

运行结果

 

我的景点图是这个图,v1表示xxxx,v的下标就是景点的代号

实验总结

借助弗洛伊德算法,完成路径表后,在P表上用Path函数就可以完成景点路径的查询,弗洛伊德算法可以完成任意两个景点的路径,但是迪杰斯卡特不行,需要再加上一个for循环

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

当前位置:首页 > 工程科技 > 电子电路

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

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