导航最短路查询系统
头文件
zka.h
#ifndef ZKA_H_INCLUDED
#define ZKA_H_INCLUDED
#define INF 0x3f3f3f3f///定义32位整形数的最大值时会提示常量转换溢出的警告
void dispath(int num,int graph[15][15],int path[15][15]);///不明白这个警告为什么会出现
void Floyd(int num,int graph[15][15],int path[15][15]);
void display();
void display2();
void diyichushihua(int graph[15][15],int path[15][15],int num,int bian);
void acfun1(int num,int graph[15][15],int path[15][15]);
void acfun2(int num,int graph[15][15],int path[15][15]);
void acfun3(int num,int graph[15][15],int path[15][15]);
void ffun(int Mdata[15][15][15],int Mpath[15][15][15]);
void acfun4(int jia,int graph[15][15],int path[15][15]);
///void acfun5(int jia,int graph[15][15],int path[15][15]);
#endif // ZKA_H_INCLUDED
zka.cpp
#include<bits/stdc++.h>
#include"zka.h"
using namespace std;
void dispath(int num,int graph[15][15],int path[15][15])
{
int i,j,k,s;///书上的代码
int apath[15],d;///功能是路径输出
for(i=0;i<num;i++)///很多细节上的东西处理得还不是很好
{
for(j=0;j<num;j++)///理解上还有些片面
{
if(graph[i][j]!=INF&&i!=j)///欠缺深度思考
{
cout<<i<<"到"<<j<<"路径为:"<<endl;
k=path[i][j];
d=0;
apath[d]=j;
while(k!=-1&&k!=i)
{
d++;
apath[d]=k;
k=path[i][k];
}
d++;
apath[d]=i;
cout<<apath[d];
for(s=d-1;s>=0;s--)
cout<<' '<<apath[s];
cout<<endl;
cout<<graph[i][j]<<endl;
}
}
}
}
void Floyd(int num,int graph[15][15],int path[15][15])///num代表图中的点数
{
int k,i,j;///最短路径算法
for(k=0;k<num;k++)///复用程度最高的一部分代码
{
for(i=0;i<num;i++)
{
for(j=0;j<num;j++)
{
if(graph[i][j]>graph[i][k]+graph[k][j])
{
graph[i][j]=graph[i][k]+graph[k][j];
path[i][j]=path[k][j];
}
}
}
}
}
void display()
{
cout<<"*********************************"<<endl;
cout<<"* *"<<endl;
cout<<"* *"<<endl;
cout<<"* 导航最短路查询系统 *"<<endl;
cout<<"* @烟台大学 *"<<endl;
cout<<"* 计算机与控制工程学院 *"<<endl;
cout<<"* by-zka *"<<endl;
cout<<"* *"<<endl;
cout<<"* *"<<endl;
cout<<"*********************************"<<endl;
}
void display2()
{
cout<<"****************************"<<endl;
cout<<"* *"<<endl;
cout<<"* *"<<endl;
cout<<"* 导航最短路查询系统 *"<<endl;
cout<<"* *"<<endl;
cout<<"* 1.加点 *"<<endl;
cout<<"* 2.加边 *"<<endl;
cout<<"* 3.查询 *"<<endl;
cout<<"* 4.加客观条件 *"<<endl;
cout<<"* 5.删点 *"<<endl;
cout<<"* 6.删边 *"<<endl;
cout<<"* *"<<endl;
cout<<"* *"<<endl;
cout<<"****************************"<<endl;
}
void diyichushihua(int graph[15][15],int path[15][15],int num,int bian)
{
int i,j,a,b,quanzhi;///这个是对最初输入数据进行初始化的一个函数
for(i=0;i<num;i++)///点到点自身的一个路径初始化
{
graph[i][i]=0;
}
for(i=0;i<bian;i++)///点与点之间的路径初始化
{
cin>>a>>b>>quanzhi;
graph[a][b]=graph[b][a]=quanzhi;
}
for(i=0;i<15;i++)///要初始化就彻底一点好了
for(j=0;j<15;j++)///路径记录数组的初始化
{
if(i!=j&&graph[i][j]<INF)
path[i][j]=i;
else
path[i][j]=-1;
}
}
void acfun1(int num,int graph[15][15],int path[15][15])
{
int jiadian,jiabianshu,a,b;///再向图中进行加点操作的函数
cout<<"请输入要加的点:"<<endl;
cin>>jiadian;
cout<<"请输入该点有几条边:"<<endl;
cin>>jiabianshu;
for(int i=0;i<jiabianshu;i++)
{
cin>>a>>b;
graph[jiadian][a]=graph[a][jiadian]=b;///对矩阵的修改操作
}
Floyd(num+1,graph,path);
}
void acfun2(int num,int graph[15][15],int path[15][15])
{
int yaojiabianshu,yaojiadian,a,b;///增加边的操作函数
cout<<"请输入您要增边的点:"<<endl;
cin>>yaojiadian;
cout<<"请输入您要为这个点增加几条边:"<<endl;
cin>>yaojiabianshu;
for(int i=0;i<yaojiabianshu;i++)
{
cin>>a>>b;
graph[yaojiadian][a]=graph[a][yaojiadian]=b;
path[yaojiadian][a]=yaojiadian;///不要忘了修改path数组
path[a][yaojiadian]=a;///
}
Floyd(num,graph,path);
}
void acfun3(int num,int graph[15][15],int path[15][15])
{
int a,b,k,d,i,j,s,apath[15];///查询具体两个点之间的最短路径
cout<<"请输入要查询的点:"<<endl;
cin>>a>>b;
cout<<"最短路径大小为:"<<endl;
cout<<graph[a][b]<<endl;
cout<<"路径输出:"<<endl;
for(i=0;i<num;i++)///比较无脑的实现方法
{
for(j=0;j<num;j++)///这个真的是咸鱼代码
{
if(graph[i][j]!=INF&&i!=j)
{
if(i==a&&j==b)
{
cout<<i<<"到"<<j<<"路径为:"<<endl;
k=path[i][j];
d=0;
apath[d]=j;
while(k!=-1&&k!=i)
{
d++;
apath[d]=k;
k=path[i][k];
}
d++;
apath[d]=i;
cout<<apath[d];
for(s=d-1;s>=0;s--)
cout<<' '<<apath[s];
cout<<endl;
}
}
}
}
}
void acfun4(int jia,int graph[15][15],int path[15][15])
{
int yaoshan;///函数实现删除图中一个点的操作
cout<<"请输入要删除的点:"<<endl;
cin>>yaoshan;
for(int i=0;i<15;i++)
{
graph[i][yaoshan]=INF;
graph[yaoshan][i]=INF;
}
graph[yaoshan][yaoshan]=0;
Floyd(jia,graph,path);
}
//void acfun5(int jia,int graph[15][15],int path[15][15])
//{
// int b,a;
// cout<<"请输入这条边:"<<endl;
// cin>>b>>a;
// graph[a][b]=graph[b][a]=INF;
// path[a][b]=path[b][a]=-1;
// Floyd(jia,graph,path);
//}
void ffun(int Mdata[15][15][15],int Mpath[15][15][15])
{
int i,j,kshu,dshu,bshu;///不仅考虑最短路径也考虑多元因素
int a,b,c;///比如最快路径和最低费用路径
cout<<"请输入您要考虑的客观条件数:"<<endl;
cin>>kshu;
cout<<"请输入图中的点数与边数:"<<endl;
cin>>dshu>>bshu;
for(int c=0;c<kshu;c++)
memset(Mdata[c],INF,sizeof(Mdata[c]));
for(int k=0;k<kshu;k++)
{
for(i=0;i<dshu;i++)
Mdata[k][i][i]=0;
}
for(int s=0;s<kshu;s++)
{
for(i=0;i<bshu;i++)
{
cin>>a>>b>>c;
Mdata[s][a][b]=Mdata[s][b][a]=c;
}
}
for(int q=0;q<kshu;q++)
{
for(i=0;i<15;i++)///
for(j=0;j<15;j++)
{
if(i!=j&&Mdata[q][i][j]<INF)
Mpath[q][i][j]=i;
else
Mpath[q][i][j]=-1;
}
}
for(int h=0;h<kshu;h++)
{
Floyd(dshu,Mdata[h],Mpath[h]);
}
for(int g=0;g<kshu;g++)
dispath(dshu,Mdata[g],Mpath[g]);
}
main.cpp
/*
* Copyright (c) 2017,烟台大学计算机与控制工程学院
* All right reserved.
* 作者: zka
* 完成日期:2017年12月22日
* 版本号: v1.0
*/
#include<bits/stdc++.h>
#include"zka.h"
using namespace std;
int main()
{
int graph[15][15],path[15][15];
int Mdata[15][15][15],Mpath[15][15][15];
memset(graph,INF,sizeof(graph));
int num,bian;
int nba,likai=0;
int gongneng;
int jia;///动态更新图中的点数,因为图中点数会随着加点功能的执行而改变
while(1)
{
display();
cout<<"是否离开本系统?(0or1)"<<endl;
cin>>nba;
if(nba==0)
break;
if(likai==0)
{
cout<<"请输入原始的点与边:"<<endl;
cin>>num>>bian;
jia=num;///这个初始化是必须的,因为有可能不加点就要使用查询功能
diyichushihua(graph,path,num,bian);
Floyd(num,graph,path);
dispath(num,graph,path);
likai=1;
}
else
{
display2();
cout<<"请根据需要来选择功能:"<<endl;
cin>>gongneng;
switch(gongneng)
{
case 1:///加一个点
acfun1(jia,graph,path);
jia=jia+1;///一开始没注意这里
dispath(jia,graph,path);
break;
case 2:///为某个点加边
acfun2(jia,graph,path);
dispath(jia,graph,path);
break;
case 3:
acfun3(jia,graph,path);///查询的时候直接输出就好了
break;
case 4:
ffun(Mdata,Mpath);
break;
case 5:///删除点
jia=jia-1;///这个就是在变量使用上的败笔
acfun4(jia,graph,path);
dispath(jia,graph,path);
break;
///暂时不用这个功能,日后一定将它改得更好
// case 6:///删除边
// acfun5(jia,graph,path);
// bian=bian-1;
// dispath(jia,graph,path);
// break;
default:
break;
}
}
}
return 0;
}