#include<iostream>
#include<iomanip>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
using namespace std;
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2
#define OK 1
#define ERROR 0
#define MAX 100
#define INFINITY 100000 //用100000表示最大值∞
#define MAX_VERTEX_NUM 20//用于邻接矩阵
typedef int Status;
typedef struct ArcCell//边的定义
{
int weight;//边的权值
}ArcCell,AdjMtrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//边的邻接矩阵类型
typedef struct VertexType//顶点信息
{
int number;//顶点编号
char name[64];//顶点名称
char intro[256];//顶点介绍
}VertexType;
typedef struct MGraph
{//图的定义
VertexType vexs[MAX_VERTEX_NUM];//顶点数组
AdjMtrix arcs;//邻接矩阵
int vexnum,arcnum;//图的当前顶点数、边数
}MGraph;
//全局变量
MGraph campus;//图结构变量(学校校园)
int d[30];
int visited[50];
int shortest[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//定义全局变量存储最小路径
int pathh[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//定义存储路径
//1.图的初始化
MGraph InitMGraph()
{
MGraph map;//构造图map
int i,j;
map.vexnum=15;//顶点个数
map.arcnum=23;//边的条数
for(i=1;i<=map.vexnum;i++)//依次设置顶点信息
map.vexs[i].number=i;
strcpy(map.vexs[1].name,"西苑宿舍");strcpy(map.vexs[1].intro,"位于学校最西端,学生住宿场所");
strcpy(map.vexs[2].name,"西苑餐厅");strcpy(map.vexs[2].intro,"为西苑学生提供就餐场所");
strcpy(map.vexs[3].name,"地下通道");strcpy(map.vexs[3].intro,"连接东苑与西苑,上方为公路");
strcpy(map.vexs[4].name,"文体馆");strcpy(map.vexs[4].intro,"学校举办文体活动的场所");
strcpy(map.vexs[5].name,"体育场");strcpy(map.vexs[5].intro,"五环体育场");
strcpy(map.vexs[6].name,"东苑宿舍");strcpy(map.vexs[6].intro,"东苑学生住宿场所");
strcpy(map.vexs[7].name,"东苑餐厅");strcpy(map.vexs[7].intro,"有博爱海都润兴三大餐厅,为东苑学生提供就餐场所");
strcpy(map.vexs[8].name,"农大花园");strcpy(map.vexs[8].intro,"在这里可以欣赏到学校的一处优美的景色");
strcpy(map.vexs[9].name,"虹子湖");strcpy(map.vexs[9].intro,"学校的湖,景色优美");
strcpy(map.vexs[10].name,"足球场");strcpy(map.vexs[10].intro,"位于学校最东端,为学生踢球场所");
strcpy(map.vexs[11].name,"科技楼信息楼化学楼");strcpy(map.vexs[11].intro,"这里有学校的信息楼,科技楼,化学楼");
strcpy(map.vexs[12].name,"办公楼图书馆生物楼");strcpy(map.vexs[12].intro,"这里有学校的办公楼,图书馆,生物楼");
strcpy(map.vexs[13].name,"教学楼");strcpy(map.vexs[13].intro,"学生学习的场所");
strcpy(map.vexs[14].name,"工程楼,文经楼");strcpy(map.vexs[14].intro,"这里有学校的工程楼,文经楼");
strcpy(map.vexs[15].name,"虹子广场");strcpy(map.vexs[15].intro,"刚步入学校南门的广场,举办各种活动的地方");
for(i=1;i<=map.vexnum;i++)
for(j=1;j<=map.vexnum;j++)
map.arcs[i][j].weight=INFINITY;//初始化邻接矩阵
map.arcs[1][2].weight=10;map.arcs[2][3].weight=40;map.arcs[3][4].weight=20;map.arcs[3][8].weight=40;map.arcs[3][11].weight=40;
map.arcs[4][5].weight=20;map.arcs[4][8].weight=20;map.arcs[5][6].weight=30;map.arcs[5][8].weight=30;map.arcs[6][7].weight=10;
map.arcs[6][9].weight=70;map.arcs[7][9].weight=60;map.arcs[7][10].weight=40;map.arcs[8][9].weight=10;map.arcs[9][10].weight=30;
map.arcs[9][13].weight=15;map.arcs[9][14].weight=30;map.arcs[10][14].weight=10;map.arcs[11][12].weight=50;map.arcs[11][15].weight=70;
map.arcs[12][13].weight=5;map.arcs[12][15].weight=10;map.arcs[13][14].weight=40;
for(i=1;i<=map.vexnum;i++)
for(j=1;j<=map.vexnum;j++)
map.arcs[j][i].weight=map.arcs[i][j].weight;
return map;
}
//2.查询景点在图中的序号
Status LocateVex(MGraph map,int v)
{
int i;
for(i=0;i<=map.vexnum;i++)
{
if(map.vexs[i].number==v)
return i;
}
return -1;
}
//3.查询输入序号l,n间的长度不超过10个景点的路径
void path(MGraph map,int l,int n,int k)
{
int s,t=k+1;int length=0;//t用于存储路径上下一顶点对应的d[]数组元素的下标
if(d[k]==n&&k<8)//若d[k]是终点且景点个数<8,则输出该路径
{
for(s=0;s<k;s++)
{
length=length+map.arcs[d[s]][d[s+1]].weight;
}
if(length<200)//打印路径小于200(定长)的路径
{
for(s=0;s<k;s++)//输出该路径,s=0时为起点m
{
cout<<d[s]<<map.vexs[d[s]].name<<"--->";
}
cout<<d[s]<<map.vexs[d[s]].name<<endl;
cout<<"总路线长为"<<length<<"米\n"<<endl;//输出最后一个顶点
}
}
else
{
s=1;
while(s<=map.vexnum)//从第m个顶点,访问所有顶点是否有路径
{
if((map.arcs[d[k]][s].weight<INFINITY)&&(visited[s]==0))//顶点有边且未被访问
{
visited[s]=1;
d[k+1]=s;//存储顶点编号
path(map,l,n,t);
visited[s]=0;//将找到的路径上的顶点的访问标志重新设置为,便于探究新的路径
}
s++;//试验下一顶点s开始是否有到终点的路径;
}
}
}
//4.查询两景点的所有路径
int allpath(MGraph map)
{
int k,i,j,l,n;
cout<<"请输入您想要查询的两个景点的编号:";
cin>>i>>j;
l=LocateVex(map,i);//LocateVex 确定该顶点是否存在。若存在,返回该顶点编号。
n=LocateVex(map,j);
d[0]=l;//路径起点l(字母).(d[]数组为全局变量)
for(k=0;k<map.vexnum;k++)
visited[k]=0;
visited[l]=1;
path(map,l,n,0);
return OK;
}
//5.迪杰斯特拉算法求单源最短路径
void ShortestPath_DIJ(MGraph map)
{
int v0,v,w,k=1,min,t,p;
int final[MAX_VERTEX_NUM];//final[w]=1表示已经求得顶点V0到Vw的的最短路径
int Pathside[MAX_VERTEX_NUM];//用于存储最短路径下标的数组
int ShortPathwet[MAX_VERTEX_NUM];//用于存储到各点最短路径的权值和
cout<<"请输入起始景点的编号:";
cin>>v0;
while(v0<0||v0>map.vexnum)//判断是否输入正确
{
cout<<"您输入的景点编号不存在,请重新输入"<<endl;
cin>>v0;
}
for(v=1;v<=map.vexnum;v++)//数组初始化
{
final[v]=0;//全部顶点初始化为未找到路径
ShortPathwet[v]=map.arcs[v0][v].weight;//将与v0有连线的路径加上权值
Pathside[v]=0;//初始化路径数组为0
}
ShortPathwet[v0]=0;
final[v0]=1;
//Dijkstr算法主体
for(v=1;v<=map.vexnum;v++)
{
min=INFINITY;
for(w=1;w<=map.vexnum;w++)//找出离当前指向顶点最近的点
{
if(!final[w]&&ShortPathwet[w]<min)//未被访问且存在边
{
k=w;
min=ShortPathwet[w];
}
}
final[k]=1;//将找到的离当前顶点最近的置1
//修正
for(w=1;w<=map.vexnum;w++)
{
if(!final[w]&&(min+map.arcs[k][w].weight<ShortPathwet[w]))
{
ShortPathwet[w]=min+map.arcs[k][w].weight;//修改当前最优路径长度
Pathside[w]=k;//存放前驱结点
}
}
}
cout<<"打印P数组:"; //打印p数组
for(t=1;t<=map.vexnum;t++)
{
cout<<Pathside[t]<<" ";
}
cout<<endl;
cout<<"打印S数组:"; //打印s数组
for(t=1;t<=map.vexnum;t++)
{
cout<<ShortPathwet[t]<<" ";
}
cout<<endl;
//打印最短路径
for(t=1;t<=map.vexnum;t++)
{
p=t;
if(t!=v0)
{
cout<<t<<map.vexs[t].name;
for(w=1;w<=map.vexnum;w++)
{
if(Pathside[p]!=0)
{
cout<<"<--"<<Pathside[p]<<map.vexs[p].name;
p=Pathside[p];
}
}
cout<<"<--"<<v0<<map.vexs[v0].name<<endl;
cout<<"总路线长为"<<ShortPathwet[t]<<"米\n"<<endl;
}
}
}
//6.主页
void menu()
{
cout << " ┌──────────────────────────────────────────────────────┐" << endl;
cout << " │ ╭ ═══════════════════════════════════════════════ ╮ │" << endl;
cout << " │ ││ 欢 迎 使 用 校 园 导 游 系 统 ││ │" << endl;
cout << " │ ╰ ═══════════════════════════════════════════════ ╯ │" << endl;
cout << " │ 欢迎来到 │" << endl;
cout << " │ 燕 山 大 学 │" << endl;
cout << " │ 菜 单 选 择 │" << endl;
cout << " │ *************************************************** │" << endl;
cout << " │ * 1.主页 ** 2.查看游览路线 * │" << endl;
cout << " │ *************************************************** │" << endl;
cout << " │ * 3.查询景点间最短路径 ** 4.查询景点间所有路径* │" << endl;
cout << " │ *************************************************** │" << endl;
cout << " │ * 5.学校景点介绍 ** 6.学校地图 * │" << endl;
cout << " │ *************************************************** │" << endl;
cout << " │ * 7.更改图信息 ** 0.退出 * │" << endl;
cout << " │ *************************************************** │" << endl;
cout << " └──────────────────────────────────────────────────────┘" << endl;
}
//以下是修改图的相关信息。
//7.重新构造图
int creatmap(MGraph &map)
{
int i,j,l,n,v0,v1,distance;
cout<<"请输入图的顶点数和边数:";
cin>>map.vexnum>>map.arcnum;
cout<<"请输入顶点信息:";
for(i=0;i<=map.vexnum;i++)//输入各顶点对应的景点信息
{
cout<<"请输入景点编号:";
cin>>map.vexs[i].number;
cout<<"请输入景点名称:";
cin>>map.vexs[i].name;
cout<<"请输入景点简介:";
cin>>map.vexs[i].intro;
}
for(i=0;i<=map.vexnum;i++)//权值初始化为无穷
for(j=0;j<=map.vexnum;j++)
map.arcs[i][j].weight=INFINITY;
printf("请输入图中各景点边的信息 \n");
for(i=1;i<=map.arcnum;i++)
{
cout<<"请输入第"<<i<<"条边的起点,终点,长度为:";
cin>>v0>>v1>>distance;
l=LocateVex(campus,v0);
n=LocateVex(campus,v1);
if(l>0&&n>0)
{
map.arcs[l][n].weight=distance;
map.arcs[n][l].weight=map.arcs[l][n].weight;
}
}
return OK;
}
//8.更改图部分信息
int newmap(MGraph &map)
{
int changenum,i,l,n,t,distance,v0,v1;
cout<<"下面请输入你要修改的景点的个数:";//修改定点对应的景点
cin>>changenum;
while(changenum<0||changenum>map.vexnum)
{
cout<<"你的输入有误,请重新输入";
cin>>changenum;
}
for(i=0;i<changenum;i++)
{
cout<<"请输入景点编号:";
cin>>l;
t=LocateVex(campus,l);
cout<<"请输入修改后景点的名称:";
cin>>map.vexs[i].name;
cout<<"请输入修改后景点的简介:";
cin>>map.vexs[i].intro;
}
cout<<"下面请输入你要修改的边的个数:";
cin>>changenum;
while(changenum<0||changenum>map.vexnum);
{
cout<<"你的输入有误,请重新输入";
cin>>changenum;
}
if(changenum!=0)
cout<<"下面请输入更新边的信息:";
for(i=1;i<=changenum;i++)
{
cout<<"修改的第"<<i<<"条边的起点,终点,长度为:";
cin>>v0,v1,distance;
l=LocateVex(campus,v0);
n=LocateVex(campus,v1);
if(l>=0&&n>=0)
{
map.arcs[l][n].weight=distance;
map.arcs[n][l].weight=map.arcs[l][n].weight;
}
}
return OK;
}
//9.增加一条边
int addside(MGraph &map)
{
int l,n,distance;
cout<<"请输入边的起点和终点编号,权值:";
cin>>l>>n>>distance;
while(l<0||l>map.vexnum||n<0||n>map.vexnum)
{
cout<<"你的输入有误,请重新输入";
cin>>l>>n;
}
if(LocateVex(campus,l)<0)
{
cout<<"此节点"<<l<<"已删除";
return OK;
}
if(LocateVex(campus,n)<0)
{
cout<<"此节点"<<n<<"已删除";
return OK;
}
map.arcs[l][n].weight=distance;
map.arcs[n][l].weight=map.arcs[l][n].weight;
map.arcnum++;
return OK;
}
//10.增加一个结点
int addvex(MGraph &map)
{
int i;
map.vexnum++;//顶点数加一
cout<<"请输入您要增加结点的信息:"<<endl;
cout<<"编号:";
cin>>map.vexs[map.vexnum].number;
cout<<"名称:";
cin>>map.vexs[map.vexnum].name;
cout<<"简介:";
cin>>map.vexs[map.vexnum].intro;
for(i=1;i<=map.vexnum;i++)
{
map.arcs[map.vexnum][i].weight=INFINITY;
map.arcs[i][map.vexnum].weight=INFINITY;
}
return OK;
}
//11.删除一个结点
int delvex(MGraph &map)
{
int i=0,j,l,v;
if(map.vexnum<=0)
{
cout<<"图中已无顶点";
return OK;
}
cout<<"下面请输入您要删除的景点编号:";
cin>>v;
while(v<0||v>map.vexnum)
{
cout<<"你的输入有误,请重新输入";
cin>>v;
}
l=LocateVex(campus,v);
if(l<0)
{
cout<<"顶点"<<v<<"已删除"<<endl;
return OK;
}
for(i=l;i<=map.vexnum-1;i++)
for(j=1;j<=map.vexnum;j++)//将二维数组中的第m+1行依次向前移动一行(删除第m行)
map.arcs[i][j]=map.arcs[i+1][j];
for(i=l;i<=map.vexnum-1;i++)
for(j=1;j<=map.vexnum;j++)//将二维数组中的第m+1列依次向前移动一列(删除第m列)
map.arcs[j][i]=map.arcs[j][i+1];
map.vexs[v].number=-1;//表示此点已删除,后期打印也不会显示该点
map.vexnum--;//顶点个数-1
return OK;
}
//12.删除一条边
int delside(MGraph &map)
{
int l,n,v0,v1;
if(map.vexnum<=0)
{
cout<<"图中已无边,无法删除";
return OK;
}
cout<<"下面请输入您要删除的边的起点和终点编号:";
cin>>v0,v1;
l=LocateVex(campus,v0);
if(l<0)
{
cout<<"此顶点"<<v0<<"已删除";
return OK;
}
n=LocateVex(campus,v1);
if(n<0)
{
cout<<"此顶点"<<v1<<"已删除";
return OK;
}
map.arcs[l][n].weight=INFINITY;//将删掉的边的权值改为无穷
map.arcs[n][l].weight=INFINITY;
map.arcnum--;//图的边数减一
return OK;
}
//13.输出图的邻接矩阵的值
void printmap(MGraph map)
{
int i,j,k=0;
for(i=1;i<=map.vexnum;i++)
{
if(map.vexs[i].number!=-1)
cout<<setw(6)<<i;
}
cout<<endl;
for(i=1;i<=map.vexnum;i++)
{
for(j=1;j<=map.vexnum;j++)
{
if(map.arcs[i][j].weight==INFINITY)
cout<<" **** ";
else
cout<<setw(6)<<map.arcs[i][j].weight;
k++;
if(k%map.vexnum==0)
cout<<endl;
}
}
}
//14.图的操作主函数
int changemap(MGraph &map)
{
int choice;
cout<<"1 重新建图 2 删除结点 3 删除边"<<endl;
cout<<"4 增加结点 5 增加边 6 更新信息"<<endl;
cout<<"7 输出邻接矩阵 8 返回主页"<<endl;
do
{
cout<<"请输入你的选择:";
cin>>choice;
switch(choice)
{
case 1:creatmap(map);break;
case 2:delvex(map);break;
case 3:delside(map);break;
case 4:addvex(map);break;
case 5:addside(map);break;
case 6:newmap(map);break;
case 7:printmap(campus);break;
case 8:system("cls");menu();return OK;
default:cout<<"未找到该功能,请输入有效选项!"<<endl;break;
}
}while(choice);
}
//15.用户登录
int userlog()
{
int i;
int a[6]={1,2,3,4,5,6},b[6];
cout<<"请输入六位密码(用空格隔开):";
for(i=0;i<6;i++)
cin>>b[i];
for(i=0;i<6;i++)
{
if(a[i]!=b[i])
{
cout<<"密码错误!自动返回主页面";
menu();
return 0;
}
}
cout<<"密码正确,登陆成功!"<<endl;
changemap(campus);
}
//16.弗洛伊德算法
void floyd(MGraph map)
{
int i,j,k;
for(i=1;i<=map.vexnum;i++)//将图的邻接矩阵赋值给 shortest二维数组,将矩阵pathh全部初始化为-1
{
for(j=1;j<=map.vexnum;j++)
{
shortest[i][j]=map.arcs[i][j].weight;
pathh[i][j]=j;
}
}
int ii,jj,k1=0;
//for(ii=1;ii<=map.vexnum;ii++)
//cout<<ii;
//cout<<ii;
for(ii=1;ii<=map.vexnum;ii++)
{
//cout<<ii;
for(jj=1;jj<=map.vexnum;jj++)
{
//cout<<pathh[ii][jj];
k1++;
//if(k1%map.vexnum==0)
//cout<<endl;
}
}
cout<<endl;
for(k=1;k<=map.vexnum;k++)//核心操作,完成了以k为中间点对所有的顶点对(i,j)进行检测和修改
{ for(i=1;i<=map.vexnum;i++)
{ for(j=1;j<=map.vexnum;j++)
{
if(shortest[i][j]>shortest[i][k]+shortest[k][j])
{ shortest[i][j]=shortest[i][k]+shortest[k][j];
pathh[i][j]=pathh[i][k];//记录一下所走的路 //P数组用来存放前驱顶点
}
}
}
}
}
//17.输出数组
void printarray(MGraph map)
{
int i,j,k=0;
for(i=1;i<=map.vexnum;i++)
cout<<setw(6)<<i;
cout<<endl;
for(i=0;i<=map.vexnum;i++)
{
cout<<i;
for(j=1;j<=map.vexnum;j++)
{
cout<<setw(6)<<pathh[i][j];
k++;
if(k%map.vexnum==0)
cout<<endl;
}
}
cout<<endl;
}
//18.输出最短路径
void display(MGraph map,int i,int j)
{
int a,b;
a=i,b=j;
cout<<"您要查询的两景点间最短路径:"<<endl;
cout<<a<<map.vexs[a].name;
while(pathh[i][j]!=b)
{
cout<<"-->"<<pathh[i][j]<<map.vexs[pathh[i][j]].name;
i=pathh[i][j];
}
cout<<"-->"<<b<<map.vexs[b].name<<endl;
cout<<map.vexs[a].name<<"-->"<<map.vexs[b].name<<"的最短路径是:"<<shortest[a][b]<<"米"<<endl;
}
//19任意两点间距离(16-19)
int shortdistance(MGraph map)
{
int i,j;
cout<<"请输入要查询的两个景点的数字编号(用空格隔开):";
cin>>i>>j;
if(i<0||i>map.vexnum||j<0||j>map.vexnum)
{
cout<<"输入信息有误!"<<endl;
cout<<"请重新输入要查询的两个景点的数字编号(用空格隔开)";
cin>>i>>j;
}
else
{
floyd(map);
//printarray(map);
display(map,i,j);
}
return OK;
}
//20显示所有景点信息
void compusinfor(MGraph map)
{
int i;
cout<<"\n\n编号 景点名称 简介\n"<<endl;
cout<<"*************************************************************************"<<endl;
for(i=1;i<=map.vexnum;i++)
{
if(map.vexs[i].number!=-1)
cout<<setw(9)<<setiosflags(ios::left)<<map.vexs[i].number<<setw(22)<<setiosflags(ios::left)<<map.vexs[i].name<<setw(10)<<setiosflags(ios::left)<<map.vexs[i].intro<<endl;
}
cout<<"*************************************************************************"<<endl;
}
void schoolmap()
{
cout << " _______________________________________________________________________________________________________________________________________________________________________________________________________" << endl;
cout << "|-------------------------------------------------------------------------------------燕山大学平面图----------------------------------------------------------------------------------------------------|" << endl;
cout << "| |" << endl;
cout << "| *29(后海) |" << endl;
cout << "| \\ |" << endl;
cout << "| *26(四体)------*27(艺术学院)------*28(第五教学楼) |" << endl;
cout << "| | \\ \\ *5(五号门) *33(二体) |" << endl;
cout << "| | ------- \\ | / \\ |" << endl;
cout << "| *25(公寓12-13 )\\ \\ | / \\ |" << endl;
cout << "| | *22(燕园餐厅)----*20(理学院)---*19(西校区第一教学楼) | / \\ |" << endl;
cout << "| | \\ | \\ | / *34(东区四教) |" << endl;
cout << "| *23(公寓10-11) \\ *21(电气学院)---*18(西校区第二教学楼) *30(塔山)--*4(图书馆)---*32(燕宏桥) / \\ |" << endl;
cout << "| | \\ \\ | | / \\ |" << endl;
cout << "| *24(超市)--*13(公寓8-9)--*12(校医院)----*15(材料学院)----*17(西校区第三教学楼) | | / \\ |" << endl;
cout << "| | | | | | *36(世纪楼--------*35(东区1-2教) |" << endl;
cout << "| | | *16(西校区第四教学楼) | | 东区图书馆) | |" << endl;
cout << "| *14(公寓6-7) *11(西校区大食堂) / | | / \\ | |" << endl;
cout << "| | | \\ / | | / \\ | |" << endl;
cout << "| | | -------- / | | *38 \\ | |" << endl;
cout << "| | | \\ / | | (东区食堂) \\ | |" << endl;
cout << "| | | *8(圆盘)-*7(里仁行政楼)-*6(里仁教学楼)---*3(三体) / \\ | |" << endl;
cout << "| *10(公寓4-5) | | / / | / *37(燕明湖) | |" << endl;
cout << "| * 9(公寓1-3) |-----*1(西大活)---*2(里仁图文信息楼)-*31(里仁实验楼) *39(东区学生公寓) | |" << endl;
cout << "| \\ | / \\ *41(一体)------42*(一号门) |" << endl;
cout << "| *0(七号门) \\ / |" << endl;
cout << "| \\ / |" << endl;
cout << "| \\ / |" << endl;
cout << "| *40(东大活) |" << endl;
cout << "|_______________________________________________________________________________________________________________________________________________________________________________________________________|" << endl;
}
//22用户界面
void mainwork()
{
menu();
int choice;
campus=InitMGraph();
do
{
cout<<"请输入你的选择:";
cin>>choice;
switch(choice)
{
case 1:system("cls");menu();break;
case 2:system("cls");ShortestPath_DIJ(campus);break;
case 3:system("cls");shortdistance(campus);break;
case 4:system("cls");allpath(campus);break;
case 5:system("cls");compusinfor(campus);break;
case 6:system("cls");schoolmap();break;
case 7:system("cls");userlog();break;
case 0:system("cls");cout<<"谢谢使用";break;
default:cout<<"未找到该功能,请输入有效选项!"<<endl;break;
}
}while(choice);
}
int main()
{
mainwork();
return 0;
}
数据结构课设
最新推荐文章于 2024-04-25 20:41:18 发布
该博客介绍了如何构建一个校园导游系统,包括初始化图、查询景点位置、查找最短路径和所有路径。系统使用邻接矩阵表示图,并实现了迪杰斯特拉算法和弗洛伊德算法来求解最短路径。用户还可以通过增加、删除节点和边,以及更新图信息来自定义校园地图。此外,系统提供了用户登录和地图展示功能,方便用户查询和了解校园景点信息。
565

被折叠的 条评论
为什么被折叠?



