课设

导航最短路查询系统

头文件

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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值