//**********************//
// 交通咨询系统v1.0 ///
// 作者:钱策 Author by QianCe ///
// 班级 05计算机一班 学号:05205020120 ///
/// mail:[email protected] QQ:185028076 ///
/***********************//
///
//邻接矩阵类
//AdiMatrix.h
#ifndef ADJMATRIX_H
#define ADJMATRIX_H
#include<vector>
#include<string>
using namespace std;
const int MaxValue=100;//最大值
struct EdgeType{
int iDistance;//路程
int iCost; //费用
float fTime; //所花费的时间
};
//城市结构体,包括城市名字以及城市在图中的编号
struct City{
int Number;
char *Name;
};
//交通网络图,有iVexNum个城市,城市之间有iEdgNum条路线,每条路线上的时间路程费用为
//Route[MaxValue][MaxValue]
class AdjMatrix{
public:
//AdjMatrix();//图的初始化,构造函数
AdjMatrix(int n);
int GetVexNum();//取得交通图的城市个数
int GetEdgNum();//取得交通图的路线数目
char* GetCityName (const int i);//通过序号取得城市的名字
int GetCityNum(char* cityname);//通过城市名字取得城市的编号
//EdgeType GetRoute (const int v1,const int v2);
void Check(int &i,int &j);//检查输入的边的序号是否越界,若越界就重输
void CreateGraph();//构造交通图
void PrintGragh();//**************************供测试用
void ShowRouteLength();//向用户显示路程长度
void ShowRouteCost();//向用户显示路程车票
void ShowRouteTime();//向用户显示路程时间
void Dijkstra(int v,int dist[],int path[]);//求一个源点到其他点的最短性质
void DijkstraShortDistance();//一个城市到其他城市的最短距离
void DijkstraLessTime();//一个城市到其他城市的最少时间
void DijkstraLessCost();//一个城市到其他城市的最少花费
void Floyd(int dist[MaxValue][MaxValue],int path[MaxValue][MaxValue]);
//两个点之间的最短性质
void FloydShortDistance();//两个城市之间的最段距离
void FloydLessTime();//两个城市之间的最少时间
void FloydLessCost();//两个城市之间的最少花费
private:
int iVexNum;//顶点数,即城市个数
int iEdgNum;//边数,即城市间的路线
City city[MaxValue];//图的顶点,即城市
EdgeType Route[MaxValue][MaxValue];//各边的权值,即路线的时间费用以及路程
};
#endif
//AdjMatrix.cpp
#include "AdjMatrix.h"
#include<iostream>
using namespace std;
AdjMatrix::AdjMatrix(int n)//初始化有n个顶点的邻接矩阵
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
if(i==j)
{
Route[i][j].fTime=0;
Route[i][j].iCost=0;
Route[i][j].iDistance=0;
}
else
{
Route[i][j].fTime=MaxValue;
Route[i][j].iCost=MaxValue;
Route[i][j].iDistance=MaxValue;
}
}
iVexNum=iEdgNum=0;
}
int AdjMatrix::GetVexNum()
{
return iVexNum;
}
int AdjMatrix::GetEdgNum()
{
return iEdgNum;
}
char* AdjMatrix::GetCityName(const int i)//取城市的名字
{
if(i<0||i>iVexNum)
{
cerr<<"参数越界,发生错误了!"<<endl;
exit(1);
}
return city[i].Name;
}
int AdjMatrix::GetCityNum(char* cityname)
{
for(int i=1;i<=iVexNum;i++)
{
if (strcmp(city[i].Name,cityname)==0)
return city[i].Number;
}
cerr<<"您输入的城市有错误"<<endl;
return -1;
}
void AdjMatrix::PrintGragh()//将图打印出来,最初测试之用
{
for(int i=0;i<iVexNum;i++)
{
for(int j=0;j<iVexNum;j++)
{
if(100==Route[i+1][j+1].iDistance)
{
Route[i+1][j+1].iDistance=1000;
}
cout<<Route[i+1][j+1].iDistance<<"/t";
}
cout<<endl;
}
}
void AdjMatrix::Check(int &i,int &j)//检查输入的边的序号是否越界,若越界就重输
{
while(1)
{
if(i<0||i>iVexNum||j<0||j>iVexNum)
cerr<<"参数越界,发生错误了,请重输!"<<endl;
else return;
cin>>i>>j;
}
}
done//
void AdjMatrix::CreateGraph()
//为了方便真是先把时间跟费用这两个权值给屏蔽掉了
{
City city1,city2;
int time,distance,cost;
char flag='y';
char *ch=new char(10);
cout<<"请输入城市的数目:";
cin>>iVexNum;
cout<<"输入城市的信息:"