公园景点导游问题Dijkstra求最短路径Word文件下载.docx
- 文档编号:20530957
- 上传时间:2023-01-23
- 格式:DOCX
- 页数:10
- 大小:185.19KB
公园景点导游问题Dijkstra求最短路径Word文件下载.docx
《公园景点导游问题Dijkstra求最短路径Word文件下载.docx》由会员分享,可在线阅读,更多相关《公园景点导游问题Dijkstra求最短路径Word文件下载.docx(10页珍藏版)》请在冰豆网上搜索。
#defineMAX1000
#defineLENGTH6
#definevalueint
typedefstruct
{
charname[30];
intnum;
}VEXTYPE;
{
VEXTYPEvexs[LENGTH];
valuearcs[LENGTH][LENGTH];
intvexnum,arcnum;
}MGraph;
MGraphb;
MGraphInitGraph()
inti,j;
MGraphG;
G。
vexnum=6;
//初始景点数为6,即图的顶点数
G.arcnum=15;
//初始景点最大路径数为15,即图的最大边数
for(i=0;
i〈G.vexnum;
i++)
vexs[i].num=i;
strcpy(G.vexs[0].name,”景点A”);
//景点A
strcpy(G。
vexs[1].name,"
景点B”);
//景点B
strcpy(G.vexs[2].name,”景点C"
);
//景点C
strcpy(G.vexs[3].name,"
景点D”);
//景点D
vexs[4].name,"
景点E"
);
//景点E
vexs[5]。
name,”景点F"
//景点F
for(j=0;
j<
vexnum;
j++)
G.arcs[i][j]=MAX;
G.arcs[0][1]=50;
//景点A与景点B的距离为50
G.arcs[0][2]=20;
//景点A与景点C的距离为20
G.arcs[0][3]=30;
//景点A与景点D的距离为30
G.arcs[1][2]=10;
//景点B与景点C的距离为10
arcs[1][4]=70;
//景点B与景点E的距离为70
G.arcs[2][5]=90;
//景点C与景点F的距离为90
arcs[3][5]=40;
//景点D与景点F的距离为40
arcs[4][5]=50;
//景点E与景点F的距离为50
i〈G。
vexnum;
for(j=0;
j〈G.vexnum;
G.arcs[j][i]=G.arcs[i][j];
returnG;
}
voidMenu()//功能需求选项菜单
cout〈〈”*********功能需求选项菜单*********\n”;
cout<
<
"
1-——输出公园内景点\n”;
cout〈〈”2———输出每两个直接相连景点的距离\n"
;
〈”3——-修改两个景点距离\n”;
〈”4—-—两景点之间最短路径\n"
;
cout〈〈"
5-—-删除某条边(两个直接相连景点的连线)\n"
cout〈<
”6-—-插入某条边\n"
0—--退出\n"
cout〈〈”*******某公园主要游览景点导游*******\n"
}
voidPutOutVex(MGraph*G)//功能1输出公园内景点
{
cout<
〈”公园内各景点”〈<
endl;
for(inti=0;
i<
G->
i++)
cout〈〈G—〉vexs[i]。
name<
”<
endl;
voidPutOutArc(MGraph*G)//功能2输出公园内每两个直接相连景点的距离
i〈G-〉vexnum;
for(intj=0;
j〈G->
if(G-〉arcs[i][j]〈MAX)
{cout〈〈G-〉vexs[i].name〈<
—-——-—〉”〈<
G—〉vexs[j]。
〈”的距离为"
<
G-〉arcs[i][j]<
〈endl;
}
}
voidChange(MGraph*G)//功能3修改:
修改两个景点距离(权值)
{intv0,v1,length;
〈”修改:
输入两顶点\n”;
cin〉〉v0;
cin〉>
v1;
输入距离:
cin>
〉length;
G-〉arcs[v0][v1]=G->
arcs[v1][v0]=length;
voidDijkstra(MGraph*G)//功能4.求最短路径输出给定两景点之间的最短路径的长度及途经的各景点
{//使用Dijkstra算法求解最短路径
intv,w,i,min,t=0,x,v0,v1;
intfinal[20],D[20],p[20][20];
”请输入起始顶点:
\n”;
〉v0;
if(v0〈0||v0>
G—〉vexnum)
{
此点不存在!
请重新输入顶点:
”;
v0;
}
cout〈〈”请输入结束顶点:
>
if(v1<
0||v1>
G—>
vexnum)
请重新输入顶点:
v1;
for(v=0;
v〈G—>
v++)
{
final[v]=0;
D[v]=G-〉arcs[v0][v];
for(w=0;
w<
w++)
p[v][w]=0;
if(D[v]<
MAX)
p[v][v0]=1;
p[v][v]=1;
}
D[v0]=0;
final[v0]=1;
for(i=1;
i〈G—>
min=MAX;
for(w=0;
w〈G—>
if(!
final[w])
if(D[w]<
min){v=w;
min=D[w];
final[v]=1;
w〈G->
final[w]&
&(min+G-〉arcs[v][w]<
D[w]))
D[w]=min+G—>
arcs[v][w];
for(x=0;
x<
G-〉vexnum;
x++)
p[w][x]=p[v][x];
p[w][w]=1;
”从"
G-〉vexs[v0]。
name〈〈"
到"
〈〈G—〉vexs[v1]。
name〈〈”的最短路径长度为:
”<
D[v1]<
〈endl;
〈”途经的景点:
for(intj=0;
j++)
if(p[v1][j]==1)
G-〉vexs[j]。
voidDeleteArc(MGraph*G)//功能5删除:
intv0,v1;
cout〈〈”请输入两顶点:
〉v0>
G—>
arcs[v0][v1]=MAX;
G—〉arcs[v1][v0]=MAX;
voidInsertArc(MGraph*G)//功能6插入:
intv0,v1,l=0;
请输入两顶点:
v0〉>
cout〈〈”请输入路径长度:
cin〉〉l;
G—〉arcs[v0][v1]=l;
arcs[v1][v0]=l;
voidmain()
{inta;
b=InitGraph();
Menu();
a;
while(a!
=0)
switch(a)
{
case1:
PutOutVex(&
b);
Menu();
break;
case2:
PutOutArc(&
b);
break;
case3:
Change(&
case4:
Dijkstra(&b);
Menu();
case5:
DeleteArc(&
case6:
InsertArc(&b);
case0:
exit
(1);
default:
a;
附录;
截图
菜单显示
功能1输出公园内景点
功能2输出每两个直接相连景点的距离
功能4两景点BF之间最短路径
功能3修改两个景点DF距离,并显示修改结果(截图中景点D→景点F距离为60)
功能5删除BC边并显示结果(截图中无景点B-->
景点C的直接距离)
功能6插入AF边并显示结果(截图中景点A与景点F之间距离为100)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 公园 景点 导游 问题 Dijkstra 求最短 路径