C++实现景区旅游信息管理系统

  //深度优先搜索导游线路

  int visited[M]={0};

  int np=0;//找到的景点个数

  int p[M];//表示各个景点的入度值

  void DFS(int c){

  //c为景点编号

  np++;//每递归调用一次就自加一次,作为判断是否到了最后一个景点

  p[c]++;

  if(np==S.count){

  //到了最后一个景点

  cout<

  returnMainFace();

  }else{

  cout<";

  }

  visited[c]=1;

  for(int i=0;i

  if(S.mat.m[c][i]>0&&visited[i]==0){

  DFS(i);

  if(S.count>np){

  cout<";

  p[c]++;

  }

  }

  }

  if(np==S.count)

  returnMainFace();

  }

  void guide_line()//导游线路

  {

  checked();

  cout<<"

  *请输入起始景点的景点编号:";

  int c;

  cin>>c;

  c--;

  for(int i=0;i

  visited[i]=0;

  p[i]=0;//入度置初值为0

  }

  np=0;

  cout<<"*形成的导游线路图(采取深度优先策略)如下所示:

  ";

  DFS(c);

  }

  //Floyd(佛洛依德)算法,A[M][M]表示最短距离,path[M][M]表示辅助数组,记住前驱

  void Floyd(int A[M][M],int path[M][M]){

  int i,j,k;

  for(i=0;i

  for(j=0;j

  if(S.mat.m[i][j]==0&&i!=j){

  //如果两点之间没有边相连,则权为无穷大

  A[i][j]=INF;//INF=999666333

  }else if(i==j){

  A[i][j]=0;

  }else{

  //S.mat.m[i][j]表示两个景点之间的道路长度

  A[i][j]=S.mat.m[i][j];

  }

  //给所有的path[i][j]赋值

  if(i!=j&&S.mat.m[i][j]

  path[i][j]=i;

  }else{

  //(i==j&&S.mat.m[i][j]=INF

  path[i][j]=-1;

  }

  }

  }

  //k注意放到最外层,让A[i][j]检测都经过每一个k

  for(k=0;k

  for(i=0;i

  for(j=0;j

  if(A[i][j]>A[i][k]+A[k][j]){//如果i->j的权值大于i->k->j的权值

  A[i][j]=A[i][k]+A[k][j];

  path[i][j]=path[k][j];//path[k][j]=k前驱?k是指向的下一个景点

  }

  }

  }

  }

  }

  void min_distance()//最短路径、距离

  {

  checked();

  int A[M][M],path[M][M];

  Floyd(A,path);//A是一个景点到另一个景点的最短路径的长度

  while(true){

  Num_Name();//编号对应的景点名称

  int i,j,k,s;

  int apath[M],d;//apath[M]是记录路径的数组

  bool flag=true;

  while(flag){

  cout<<" -景点1:";

  cin>>i;

  i--;

  if(i<0||i>S.count-1){

  cout<<"*请输入合法的景点编号:

  ";

  }else{

  flag=false;

  }

  }

  flag=true;

  while(flag){

  cout<<" -景点2:";

  cin>>j;

  j--;

  if(j<0||j>S.count-1){

  cout<<"*请输入合法的景点编号:

  ";

  }else{

  flag=false;

  }

  }

  if(A[i][j]

  k=path[i][j];//k是指向的下一个景点

  d=0;//路径有d+2个景点,是数组apath的下标

  //将待输出的路径的点存放在栈apath中

  apath[d]=j;//最后一个景点

  while(k!=-1&&k!=i){

  d++;

  apath[d]=k;

  //再继续判断还有没有景点

  k=path[i][k];

  }

  d++;

  apath[d]=i;//加上第一点

  cout<<"

  *从 "<

  cout<

  for(s=d-1;s>=0;s--){//将剩下的景点(apath[M]数组剩下的元素)打印出来

  cout<<"-->"<

  }

  cout<<" ,最短距离为:"<

  }else if(i==j){

  cout<<"

  *景点输入不合法,输入的两个景点不能相同!

  ";

  }else{

  cout<<"

  *这两个景点间不存在路径

  ";

  }

  cout<<"

  是否继续执行最短路径和最短距离的查询(Y/N)";

  Y_N();

  }

  returnMainFace();

  }

  //道路修建规划图、最小生成树(prime算法)

  void build_road()

  {

  checked();

  cout<<"

  *道路修建规划图(prime算法)规划如下:

  ";

  //Ai[M]表示待选边的权值,邻接矩阵的一行,closest[M]:点编号数组,记录下一条路的起点景点的编号

  intAi[M],min,closest[M],i,j,k,sum=0,num=0;//num表示第几条路

  int A[M][M];

  //赋权值

  for(i=0;i

  for(j=0;j

  if(S.mat.m[i][j]==0&&i!=j){

  A[i][j]=INF;

  }else if(i==j){

  A[i][j]=0;

  }else{

  A[i][j]=S.mat.m[i][j];

  }

  }

  }

  for(i=0;i

  Ai[i]=A[0][i];//取第一行存四个Ai[i],就是一个景点到所有景点的权值

  closest[i]=0;//0

  }

  for(i=1;i

  min=INF;

  //从Ai[j]中选出最小的值存放在min

  for(j=0;j

  if(Ai[j]!=0&&Ai[j]

  min=Ai[j];

  k=j;//记录最小的值的列j:k=j,为了下面标志此路已选

  }

  }

  if(min

  cout<<" -第 "<<++num<<" 条路: 从"<

  sum+=min;//sum累计道路长度,即是已选的权值

  }

  Ai[k]=0;//标志为已选的边的权值,避免重复选择

  //例子:对比a到c和b到c的权值,取最小存进Ai[j]中

  for(j=0;j

  if(A[k][j]!=0&&A[k][j]

  Ai[j]=A[k][j];

  closest[j]=k;//点编号数组,记录下一条路的起点景点的编号

  }

  }

  }

  cout<<"*修建道路的总长度为:"<

  returnMainFace();

  }