⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 intmain.cpp

📁 传统的Dijkstra 算法无疑是解决一般最短路径问题的最优算法
💻 CPP
字号:
#include"diaodu.h"
GRaph net;//全局变量,存储站点信息


int cusmenu()//乘客选择菜单
{
	ElemType h[100],t[100];//e[i][j]为线路i上的站点j
    int i,countt[4],counth[4],change[4];//一开始counth是从起点出发的线路数,countt是进入终点的线路数
	int choice1;
	int path[3];
	for(i=0;i<4;i++)
		countt[i]=counth[i]=0;

    while(1)
	{
    cout<<right<<setfill('-')<<setw(25)<<"乘客选择菜单"<<setfill('-')<<setw(25)<<"-"<<endl;
	cout<<setfill(' ')<<setw(30)<<left<<"1:输入起点和终点。"<<endl<<endl;
	cout<<setfill(' ')<<setw(30)<<left<<"2:求直达或只转一次车的路线。"<<endl<<endl;	
	cout<<setfill(' ')<<setw(30)<<left<<"3:求换乘多次的路线。"<<endl<<endl;
	cout<<setfill(' ')<<setw(30)<<left<<"4:求时间最短的线路。"<<endl<<endl;
	cout<<setfill(' ')<<setw(30)<<left<<"5:提供几条时间较短线路。"<<endl<<endl;
	cout<<0<<":返回主菜单."<<endl;
    cout<<setw(50)<<setfill('-')<<'-'<<endl<<endl;
    cout<<"请选择n:";
	cin>>choice1;
	switch(choice1)
	{
	case 0:return 0;
	case 1:
	cout<<"输入起点(S+小于3957的四位数):";
    cin>>vhead;
	counth[0]=net.findpathout(h,vhead);
	cout<<"输入终点(S+小于3957的四位数):";
	cin>>vtail;
	countt[0]=net.findpathin(t,vtail);
	for(i=0;i<4;i++)
		change[i]=0;
	break;

	case 2:
    cout<<"不需换车的线路为:"<<endl;
	change[0]=net.directpath(h,t,counth[0],countt[0]);//如果有直接路线,计算然后输出。
	if(change[0]==0)cout<<"没有直达路线。"<<endl;
    //然后再看转车一次的路线。找到线路h[i],t[j]上的站点e[i][u],f[j][k],看有没有相同的公共站点,有就是路线h[i]->e[i][j]->t[j]
	cout<<"转一次车的线路为:"<<endl;
	change[1]=net.oncepath(h,t,counth[0],countt[0]);
	if(change[1]==0)cout<<"没有转一次车的线路。"<<endl;
	cout<<endl;
	break;

	case 3:
    cout<<"转多次车的所有线路为:"<<endl;
	change[2]=net.twiceandthreepath(h,t,counth[0],countt[0],counth[1],countt[1]);
	if(change[2]==0)cout<<"没有转多次车的所有线路。"<<endl;
	cout<<endl;
	break;

	case 4:
	cout<<"换乘次数为2次以内的最快路线为:"<<endl;
    path[0]=net.oncepathtime(h,t,counth[0],countt[0]);
	path[1]=net.twiceandthreepathtime(h,t,counth[0],countt[0],counth[1],countt[1]);
	if(!path[0]&&!path[1])cout<<"两个站点没有路线到达。"<<endl;
	cout<<endl;
	break;

	case 5:
		cout<<"换乘次数为2次以内的多条较快路线为:"<<endl;
    path[0]=net.oncepathsometime(h,t,counth[0],countt[0]);
    path[1]=net.twiceandthreepathsometime(h,t,counth[0],countt[0],counth[1],countt[1]);
	if(!path[0]&&!path[1])cout<<"两个站点没有路线到达。"<<endl;
	cout<<endl;
	break;
	}
	}
}

int guanli()//管理员菜单
{
	char filename[10];
	char str[10]=".txt";
	net.initiate();
	int i,k,choice1;
	ElemType busname;
	ARcType *p;
    while(1)
	{
    cout<<right<<setfill('-')<<setw(25)<<"管理员菜单"<<setfill('-')<<setw(25)<<"-"<<endl;
	cout<<setfill(' ')<<setw(30)<<left<<"1:初始化公交查询系统。"<<endl<<endl;
	cout<<setfill(' ')<<setw(30)<<left<<"2:查看某站点的出入站情况。"<<endl<<endl;
    cout<<setfill(' ')<<setw(30)<<left<<"3:查看所有线路(由于线路过多一开始会出现闪屏)。"<<endl<<endl;
    cout<<setfill(' ')<<setw(30)<<left<<"4:根据统计的线路的数据对该线路进行公车的调度"<<endl<<endl;
	cout<<setfill(' ')<<setw(30)<<left<<"0:返回主菜单。"<<endl;
    cout<<setw(50)<<setfill('-')<<'-'<<endl<<endl;
    cout<<"请选择n:";
	cin>>choice1;
	switch(choice1)
	{
	case 0:return 0;
	case 1:
		if(net.getdata())cout<<"初始化公交查询系统成功。"<<endl<<endl;
		break;
	case 2:
	    cout<<"输入站点名(S+小于3957的四位数):";
		while(1)
		{
		cin>>busname;
		k=changel(busname);
		if(k<1||k>3977){cout<<"输入有误,请重新输入(S+3957以下的四位数):";}
		else break;
		}
        cout<<"从站点"<<busname<<"出发的线路情况为:"<<endl;
		for(p=net.graph[k].firstarc;p;p=p->nextarc)	
		{
			cout<<net.graph[k].vertexname<<"->";
			cout<<p->lname<<"-->"<<net.graph[p->adjvertex].vertexname<<endl;
		}

        cout<<"进入站点"<<busname<<"的线路情况为:"<<endl;
		for(p=net.graph1[k].firstarc;p;p=p->nextarc)	
		{
			cout<<net.graph[p->adjvertex].vertexname<<"->";
			cout<<p->lname<<"-->"<<net.graph[k].vertexname<<endl;
		}
		cout<<endl;
		break;
	case 3:
		Showall();
		cout<<endl;
		break;
	case 4:

	cout<<"请输入公交调度所需数据所在的文件名(目前只有“xianlu1”这个文件)。"<<endl;
	cin>>filename;
	strcat(filename,str);
	while(1)
	{
	cout<<"根据文件的数据可以得出公交调度及相关数据如下:"<<endl;
    if(getdata1(filename))break;
	else cout<<"请重新输入:";
	cin>>filename;
	strcat(filename,str);
	}
	for(i=0;i<5;i++)
		findbestBi(i,b1);
	cout<<endl;
	break;
	}
	}
}


	
int main()
{
	string str;
    char ch;
	int choice1;
    while(1)
	{
    cout<<right<<setfill('-')<<setw(25)<<"主菜单"<<setfill('-')<<setw(25)<<"-"<<endl;
	cout<<setfill(' ')<<setw(30)<<left<<"1:管理员菜单。"<<endl<<endl;
	cout<<setfill(' ')<<setw(30)<<left<<"2:乘客菜单。"<<endl<<endl;
	cout<<setfill(' ')<<setw(30)<<left<<"0:结束程序。"<<endl;
    cout<<setw(50)<<setfill('-')<<'-'<<endl<<endl;
    cout<<"请选择n:";
	cin>>choice1;
	switch(choice1)
	{
	case 0:return 0;
	case 1:
		while(1)
		{
		cout<<"输入管理员密码(为:111):"<<endl;
		cin>>str;
		if(str=="111")if(!guanli())break;
		else
		cout<<"密码错误,重新输入Y|N:";
        cin>>ch;
		if(ch=='Y'||ch=='y')continue;
		else break;
		}
	break;

	case 2:
      if(!cusmenu())break;
	}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -