`
jgsj
  • 浏览: 960515 次
文章分类
社区版块
存档分类
最新评论

使用邻接矩阵实现的图结构(添加深度优先搜索)

 
阅读更多

使用邻接矩阵实现的图结构(添加深度优先搜索)
这次我使用了深度优先搜索。以前的文章如下所示。这个算法困难啊,调试了我好一段时间。下面就是我扩充的深度优先搜索的内容。以前发布的程序有诸多不足,还有几个致命的错误,我就不解释了,这个是优化了的,比以前的好了些。我以前写的图结构:http://student.csdn.net/space.php?uid=999749&do=blog&id=51129

下面是我的JGraph.h代码:

Code:
  1. /*----------------------------------------------------------------------------
  2. 蒋轶民制作:E-mail:jiangcaiyang123@163.com
  3. ------------------------------------------------------------------------------
  4. 文件名:JGraph.h
  5. ------------------------------------------------------------------------------
  6. 作用:这是使用邻接矩阵制作的图状结构,基本实现了图的创建操作。
  7. ------------------------------------------------------------------------------
  8. 调用规范:无
  9. /*--------------------------------------------------------------------------*/
  10. //条件编译
  11. #ifndef_JGRAPH_H_
  12. #define_JGRAPH_H_
  13. /*--------------------------------------------------------------------------*/
  14. //头文件
  15. #include<limits.h>
  16. //定义的宏
  17. #defineINFINITYINT_MAX
  18. #defineMAX_VERTEX_NUM20
  19. /*--------------------------------------------------------------------------*/
  20. //定义一系列类型
  21. enumGraphKind{DG,DN,UDG,UDN};//图的类型枚举
  22. typedefunsignedintVRType;
  23. typedefcharInfoType;
  24. typedefstruct
  25. {
  26. VRTypeadj;//顶点关系类型
  27. InfoType*info;//弧的信息
  28. }AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
  29. //图的定义
  30. template<typenameCustomType>
  31. classJMatrixGraph
  32. {
  33. public:
  34. JMatrixGraph():vexnum(0),arcnum(0){}//默认构造函数
  35. voidCreateGraph(GraphKindinputKind);//创建图
  36. voidDFSTraverse(bool(*Visit)(intv));//深度优先搜索遍历
  37. private:
  38. voidCreateDG(void);//创建有向图
  39. voidCreateDN(void);//创建有向网
  40. voidCreateUDG(void);//创建无向图
  41. voidCreateUDN(void);//创建无向网
  42. voidDepthFirstSearch(intv,bool(*Visit)(intv));//深度优先搜索
  43. intFirstAdjVex(intv);//返回第v个顶点的第一个邻接点
  44. intNextAdjVex(intv,intw);//返回第v个顶点的下一个邻接点
  45. CustomTypevexs[MAX_VERTEX_NUM];//顶点向量
  46. AdjMatrixarcs;//邻接矩阵
  47. intvexnum,arcnum;//图的顶点数和弧数
  48. GraphKindkind;//图的种类标志
  49. boolvisited[MAX_VERTEX_NUM];//访问标志数组
  50. };
  51. /*--------------------------------------------------------------------------*/
  52. //创建图
  53. template<typenameCustomType>
  54. voidJMatrixGraph<CustomType>::CreateGraph(GraphKindinputKind)
  55. {
  56. switch(inputKind)
  57. {
  58. caseDG:returnCreateDG();
  59. caseDN:returnCreateDN();
  60. caseUDG:returnCreateUDG();
  61. caseUDN:returnCreateUDN();
  62. }
  63. }
  64. template<typenameCustomType>//创建有向图
  65. voidJMatrixGraph<CustomType>::CreateDG(void)
  66. {
  67. inti,j,k;
  68. intv1,v2,incInfo;
  69. cout<<"输入顶点个数:/n";
  70. cin>>vexnum;
  71. cout<<"输入弧的个数:/n";
  72. cin>>arcnum;
  73. if(arcnum>vexnum*(vexnum-1)*0.5f)
  74. {
  75. cout<<"输入错误!因为不满足n(n-1)/2的条件。/n";
  76. return;
  77. }
  78. cout<<"输入弧的信息(0表示忽略):/n";
  79. cin>>incInfo;
  80. for(i=0;i<vexnum;i++)
  81. {
  82. cout<<"请输入第"<<i+1<<"个顶点的内容:/n";
  83. cin>>vexs[i];
  84. }
  85. for(i=0;i<vexnum;i++)
  86. {
  87. for(j=0;j<vexnum;j++)
  88. {
  89. arcs[i][j].adj=0;
  90. arcs[i][j].info=NULL;
  91. }
  92. }
  93. for(k=0;k<arcnum;k++)
  94. {
  95. cout<<"请输入第"<<k+1<<"边连接的两个顶点。/n";
  96. cin>>v1>>v2;
  97. arcs[v1-1][v2-1].adj=1;
  98. if(incInfo!=0)
  99. {
  100. cout<<"输入弧的信息,以字符串的形式存储。/n";
  101. cin>>arcs[v1-1][v2-1].info;
  102. }
  103. }//这里设置断点,下同
  104. }
  105. template<typenameCustomType>//创建有向网
  106. voidJMatrixGraph<CustomType>::CreateDN(void)
  107. {
  108. inti,j,k;
  109. intv1,v2,incInfo;
  110. intw;
  111. cout<<"输入顶点个数:/n";
  112. cin>>vexnum;
  113. cout<<"输入弧的个数:/n";
  114. cin>>arcnum;
  115. if(arcnum>vexnum*(vexnum-1)*0.5f)
  116. {
  117. cout<<"输入错误!因为不满足n(n-1)/2的条件。/n";
  118. return;
  119. }
  120. cout<<"输入弧的信息(0表示忽略):/n";
  121. cin>>incInfo;
  122. for(i=0;i<vexnum;i++)
  123. {
  124. cout<<"请输入第"<<i+1<<"个顶点的内容:/n";
  125. cin>>vexs[i];
  126. }
  127. for(i=0;i<vexnum;i++)
  128. {
  129. for(j=0;j<vexnum;j++)
  130. {
  131. arcs[i][j].adj=INFINITY;
  132. arcs[i][j].info=NULL;
  133. }
  134. }
  135. for(k=0;k<arcnum;k++)
  136. {
  137. cout<<"请输入第"<<k+1<<"边连接的两个顶点和权值。/n";
  138. cin>>v1>>v2>>w;
  139. arcs[v1-1][v2-1].adj=w;
  140. if(incInfo!=0)
  141. {
  142. cout<<"输入弧的信息,以字符串的形式存储。/n";
  143. cin>>arcs[v1-1][v2-1].info;
  144. }
  145. }
  146. }
  147. template<typenameCustomType>//创建无向图
  148. voidJMatrixGraph<CustomType>::CreateUDG(void)
  149. {
  150. inti,j,k;
  151. intv1,v2,incInfo;
  152. cout<<"输入顶点个数:/n";
  153. cin>>vexnum;
  154. cout<<"输入弧的个数:/n";
  155. cin>>arcnum;
  156. if(arcnum>vexnum*(vexnum-1)*0.5f)
  157. {
  158. cout<<"输入错误!因为不满足n(n-1)/2的条件。/n";
  159. return;
  160. }
  161. cout<<"输入弧的信息(0表示忽略):/n";
  162. cin>>incInfo;
  163. for(i=0;i<vexnum;i++)
  164. {
  165. cout<<"请输入第"<<i+1<<"个顶点的内容:/n";
  166. cin>>vexs[i];
  167. }
  168. for(i=0;i<vexnum;i++)
  169. {
  170. for(j=0;j<vexnum;j++)
  171. {
  172. arcs[i][j].adj=0;
  173. arcs[i][j].info=NULL;
  174. }
  175. }
  176. for(k=0;k<arcnum;k++)
  177. {
  178. cout<<"请输入第"<<k+1<<"边连接的两个顶点。/n";
  179. cin>>v1>>v2;
  180. arcs[v1-1][v2-1].adj=1;
  181. cout<<"该元素的值是:"<<arcs[v1-1][v2-1].adj;
  182. if(incInfo!=0)
  183. {
  184. cout<<"输入弧的信息,以字符串的形式存储。/n";
  185. cin>>arcs[v1-1][v2-1].info;
  186. }
  187. arcs[v2-1][v1-1].adj=arcs[v1-1][v2-1].adj;
  188. }
  189. }
  190. template<typenameCustomType>//创建无向网
  191. voidJMatrixGraph<CustomType>::CreateUDN(void)
  192. {
  193. inti,j,k;
  194. intv1,v2,incInfo;
  195. intw;
  196. cout<<"输入顶点个数:/n";
  197. cin>>vexnum;
  198. cout<<"输入弧的个数:/n";
  199. cin>>arcnum;
  200. if(arcnum>vexnum*(vexnum-1)*0.5f)
  201. {
  202. cout<<"输入错误!因为不满足n(n-1)/2的条件。/n";
  203. return;
  204. }
  205. cout<<"输入弧的信息(0表示忽略):/n";
  206. cin>>incInfo;
  207. for(i=0;i<vexnum;i++)
  208. {
  209. cout<<"请输入第"<<i+1<<"个顶点的内容:/n";
  210. cin>>vexs[i];
  211. }
  212. for(i=0;i<vexnum;i++)
  213. {
  214. for(j=0;j<vexnum;j++)
  215. {
  216. arcs[i][j].adj=INFINITY;
  217. arcs[i][j].info=NULL;
  218. }
  219. }
  220. for(k=0;k<arcnum;k++)
  221. {
  222. cout<<"请输入第"<<k+1<<"边连接的两个顶点和权值。/n";
  223. cin>>v1>>v2>>w;
  224. arcs[v1-1][v2-1].adj=w;
  225. if(incInfo!=0)
  226. {
  227. cout<<"输入弧的信息,以字符串的形式存储。/n";
  228. cin>>arcs[v1-1][v2-1].info;
  229. }
  230. arcs[v2-1][v1-1].adj=arcs[v1-1][v2-1].adj;
  231. }
  232. }
  233. /*--------------------------------------------------------------------------*/
  234. //深度优先搜索遍历
  235. template<typenameCustomType>
  236. voidJMatrixGraph<CustomType>::DFSTraverse(bool(*Visit)(intv))
  237. {
  238. intv;
  239. for(v=0;v<vexnum;v++)visited[v]=false;
  240. for(v=0;v<vexnum;v++)
  241. if(!visited[v])DepthFirstSearch(v,Visit);
  242. }
  243. /*--------------------------------------------------------------------------*/
  244. //深度优先搜索
  245. template<typenameCustomType>
  246. voidJMatrixGraph<CustomType>::DepthFirstSearch(intv,bool(*Visit)(intv))
  247. {
  248. visited[v]=true;Visit(v);
  249. intw;
  250. for(w=FirstAdjVex(v);w>=0;w=NextAdjVex(v,w))
  251. if(!visited[w])DepthFirstSearch(w,Visit);
  252. }
  253. /*--------------------------------------------------------------------------*/
  254. //返回第v个顶点的第一个邻接点
  255. template<typenameCustomType>
  256. intJMatrixGraph<CustomType>::FirstAdjVex(intv)
  257. {
  258. inti;
  259. for(i=0;i<vexnum;i++)
  260. if(arcs[v][i].adj!=0)returni;//这里只对无向图进行计算
  261. return-1;
  262. }
  263. /*--------------------------------------------------------------------------*/
  264. //返回第v个顶点的下一个邻接点
  265. template<typenameCustomType>
  266. intJMatrixGraph<CustomType>::NextAdjVex(intv,intw)
  267. {
  268. inti;
  269. for(i=w+1;i<vexnum;i++)
  270. if(arcs[v][i].adj!=0)returni;//这里只对无向图进行计算
  271. return-1;
  272. }
  273. #endif

下面是我对《数据结构(严蔚敏版)》168页的G4图进行深度优先搜索。MainFrame.h文件如图所示。

Code:
  1. /*----------------------------------------------------------------------------
  2. 蒋轶民制作:E-mail:jiangcaiyang123@163.com
  3. ------------------------------------------------------------------------------
  4. 文件名:MainFrame.h
  5. ------------------------------------------------------------------------------
  6. 作用:验证图结构是否创建成功。
  7. /*--------------------------------------------------------------------------*/
  8. //头文件
  9. #include<iostream>
  10. #include"JGraph.h"
  11. usingnamespacestd;
  12. boolVisitFunc(intv)
  13. {
  14. cout<<"-----------深度优先搜索------------/n";
  15. cout<<"访问第"<<v+1<<"个顶点/n";
  16. returntrue;
  17. }
  18. //程序的入口
  19. intmain(intargc,char**argv)
  20. {
  21. JMatrixGraph<char>jmg;
  22. jmg.CreateGraph(UDG);
  23. jmg.DFSTraverse(VisitFunc);
  24. return0;
  25. }

程序的截图如图所示:

以后还会实现广度优先搜索和更多的功能的!

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics