Source.cpp
上传用户:yingjiejs
上传日期:2022-06-05
资源大小:841k
文件大小:5k
源码类别:

GIS编程

开发平台:

Visual C++

  1. #include "Head.h"
  2. #include <stdio.h>
  3. //初始化图的信息
  4. void InitGraph(MGraph  &M,int* a,string* v,string *no,string *vifo,string arcifos[][8], int n )                     
  5. int i,j; 
  6. M.vertexNum=n; 
  7. for (i=0; i<MaxSize; i++)
  8. {
  9. for (j=0; j<MaxSize; j++)                            
  10.    M.arc[i][j] = MAX;
  11. }
  12. for ( i=0; i<M.vertexNum; i++)
  13. {
  14. M.vertex[i]=v[i]; //对节点名称赋值
  15. M.vno[i]=no[i];   //对弧信息进行赋值(存导游系统中的节点的代号)
  16. M.ifo[i]=vifo[i]; //对边的信息(存导游系统中的节点简介)
  17. }
  18. for (i=0; i<M.vertexNum; i++)
  19. {
  20. for (j=0; j<M.vertexNum; j++)
  21. M.arc[i][j]=*(a+i*n+j); 
  22. M.arcifo[i][j]=arcifos[i][j];   
  23. }
  24. }
  25. //输出整张图的信息
  26. void PutOutVexInfo(MGraph &M)                          
  27. {    
  28. printf("名称ttt代号tt简介nn");                  
  29. for(int i=0;i<M.vertexNum;i++)
  30. {
  31. printf("%stt%stt%sn",M.vertex[i].c_str(),M.vno[i].c_str(),M.ifo[i].c_str());
  32. }
  33. }
  34. //输出从所有的边的权重
  35. void PutOutArcInfo(MGraph &M)                                                 
  36. {
  37. printf("所有的边的信息为:n");
  38. for(int i=0;i<M.vertexNum;i++)                    
  39. for(int j=0;j<i;j++)
  40. {
  41. if(M.arc[i][j]<MAX)           
  42. {  
  43. printf("从 %s 到  %s 的路径长度为:",M.vertex[i].c_str(),M.vertex[j].c_str()); 
  44. printf("%4d",M.arc[i][j]); 
  45. printf("路名:%sn",M.arcifo[i][j].c_str());                 
  46. }
  47. }
  48. }
  49. //改变某一条弧的权重
  50. void SetArc(MGraph &M,int v1,int v2,int arclength)      
  51. {    
  52. //输入的V1和V2不存就出现异常                                                   
  53. if ( v1>M.vertexNum|| v2>M.vertexNum)
  54. {
  55. printf("v1或者v2的值不合法!n");
  56. return;
  57. }
  58.     else
  59. { M.arc[v1][v2]=arclength;                         
  60. M.arc[v2][v1]=arclength;
  61. }
  62. printf("从%s到%s的路径长度为:%d",M.vertex[v1].c_str(),M.vertex[v2].c_str(),M.arc[v1][v2]);
  63. }
  64. //删除某一个弧
  65. void DeleteArc(MGraph &M,int n, int w)                 
  66. {
  67. if ( n>MaxSize||  w>MaxSize) 
  68. {
  69. printf("输入的n或者w不合法n");
  70. return;
  71. }
  72. M.arc[n][w]=M.arc[w][n]=MAX;
  73. printf("删除成功!n");
  74. printf("删除后整张图的路径情况:n");
  75. PutOutArcInfo(M);
  76. }
  77. //到某个顶点的路径
  78. void to_vex(MGraph &M,int endv)
  79. {
  80. if (endv <M.vertexNum && endv >=0 && endv!=beginv)                      
  81. {
  82.       string mmm="";                                    //初始化字符串
  83.       int j =endv;
  84.       while(j > -1 )
  85.       {
  86.         string nnn =M.vertex[j];                         //依次把顶点存放在nnn字符串中
  87.         nnn+=mmm;
  88.         mmm = " "+nnn;
  89.         j = path[j];
  90.       }
  91.   printf("从到%s到%s的路径长度为:",M.vertex[beginv].c_str(),M.vertex[endv].c_str());
  92.   printf("%4d",dist[endv]); 
  93.   printf("路径:%sn",mmm.c_str());
  94.     }
  95. }
  96. void to_vexs(MGraph &M)
  97. {     
  98.   for(int i=0;i<M.vertexNum;i++)
  99. to_vex(M,i);
  100. }
  101. //求最短路径,从v顶点到endv点的最短路径
  102. void  Dijkstra(MGraph &M,int beginv1,int endv1,int road)              
  103. {   
  104.     v=beginv=beginv1;endv=endv1;
  105. int oldway=-1;
  106. //v顶点或endv顶点输出不正确则结束
  107. if ( beginv>=M.vertexNum ||beginv<0 ||endv>=M.vertexNum || endv<0)
  108. {
  109. return;
  110. }                    
  111. int i,j,k,wm;
  112. for(i=0;i<M.vertexNum;i++)//按网的邻接矩阵确定各顶点最短路径的初值
  113. {
  114. dist[i]=M.arc[v][i];                 
  115. if(i!=v&& dist[i]< MAX)//如果v、i之间有路
  116. path[i]=v; //当前找到的最短路径为v
  117.     else
  118.       path[i]=-1;      //否则v与i顶点不存在路径
  119.       s[i] = 0;        //给s集合确定初值0 
  120. }
  121. s[v]=1;dist[v]=0;   //将顶点v本身排除在外
  122.   for(k =0;k<M.vertexNum-1;k++)//求其他numv-1各顶点的最短路径
  123.   {
  124.      wm = MAX;
  125.  j=beginv; //确定当前最短路径wm及顶点的序号j
  126.  oldway=path[endv]; 
  127.     for( i=0;i<M.vertexNum;i++)                            
  128.     {
  129.       if(!s[i]&&dist[i]<wm)//如果v、i之间有路
  130.       {
  131.         j=i;
  132. wm = dist[i]; //把当前找到的路径确定为最大值
  133.       }
  134.     }
  135.       s[j]=1;
  136.       for(i =0;i<M.vertexNum;i++) //更新未确定最短路径各顶点的当前最短路径
  137.       {
  138.         if(!s[i]&&dist[j]+M.arc[j][i]<dist[i])  //如果v、i两点的距离加上i、j小于从v点到j点的距离
  139.         {
  140.           dist[i]=dist[j]+M.arc[j][i];
  141.   path[i]=j;
  142. }
  143.   }
  144.   if(road==MUL && oldway!=path[endv] )
  145.   {
  146.   printf("前最短路径:n");
  147.   to_vex(M,endv);
  148.   }
  149.     }
  150.   printf("n");
  151.   if(road==EVERYONE)
  152.   { 
  153.   printf("最短路径:n");
  154.   to_vexs(M);
  155.   }
  156.   else
  157.   {
  158.   printf("最短路径:n");
  159.   to_vex(M,endv);
  160.   }
  161. }
  162. //菜单
  163. void nemu()
  164. {
  165.   system("cls");
  166.   printf("1.输出顶点信息:n");                      //输入你要进行的操作的序号
  167.       printf("2.输出边的信息:n");
  168.       printf("3.修改某条路径:n");
  169.   printf("4.删除某一条边:n");
  170.   printf("5.两地最短的路径:n");
  171.   printf("6.到某地最短路径:n");
  172.       printf("7.退出n");
  173.   printf("++++++++++++++++++>>>>n");
  174. }