图的创建弗洛伊德算法求景点路径.docx
《图的创建弗洛伊德算法求景点路径.docx》由会员分享,可在线阅读,更多相关《图的创建弗洛伊德算法求景点路径.docx(18页珍藏版)》请在冰豆网上搜索。
图的创建弗洛伊德算法求景点路径
姓名
黄皓
学号
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;ifor(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;vfor(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循环