经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » PHP » 查看文章
[PHP] 算法-邻接矩阵图的广度和深度优先遍历的PHP实现
来源:cnblogs  作者:陶士涵  时间:2018/9/27 16:49:52  对本文有异议
  1. 1.图的深度优先遍历类似前序遍历,图的广度优先类似树的层序遍历
  2. 2.将图进行变形,根据顶点和边的关系进行层次划分,使用队列来进行遍历
  3. 3.广度优先遍历的关键点是使用一个队列来把当前结点的所有下一级关联点存进去,依次进行
  4. 邻接矩阵的广度优先遍历:
  5. BFS(G)
  6. for i=0;i<G->numVertexes;i++
  7. visited[i]=false;//检测是否访问过
  8. for i=0;i<G.numVertexes;i++//遍历顶点
  9. if visited[i]==true break;//访问过的断掉
  10. visited[i]=true //当前顶点访问
  11. InQueue(i) //当前顶点入队列
  12. while(!QueueEmpty()) //当前队列不为空
  13. i=OutQueue() //队列元素出队列
  14. for j=0;j<G->numVertexes;j++ //遍历顶点
  15. if G->arc[i][j]==1 && !visited[j] //当前顶点与其他顶点存在关系并且未被访问
  16. visited[j]=true //标记此顶点
  17. InQueue(j) //此顶点入队列,会排在后面等前面一层的全遍历完才会遍历这个
  18. 深度优先遍历DFS:
  19. DFSTravserse G
  20. for i=0;i<G.xNum;i++
  21. if !visted[i]
  22. DFS(G,i)
  23. DFS G,i
  24. visted[i]=true
  25. print G.vexs[i]
  26. if G.arc[i][j]==1 && !visited[j]
  27. DFS(G,j)
  28. 图的物理存储的实现:
  29. 邻接矩阵 邻接链表 十字链表 邻接多重表
  30. 有向图的存储方法:十字链表
  31. 无向图存储的优化:邻接多重表
  32. 图的遍历:
  33. 1.从图中某一顶点出发访遍图中其余顶点,且使每个顶点仅被访问一次
  34. 2.需要给访问过的顶点打上标记,设置个数组visited[n],访问过后设置为1
  35. 3.遍历次序:深度优先遍历和广度优先遍历
  36. 深度优先遍历DFS:
  37. 1.类似走迷宫右手定则,走一个做标记,一直往右走,直到重复了,就退回上一个顶点
  38. 2.从某个顶点v出发访问和v有路径相通的顶点,递归调用
  1. <?php
  2. class Graph{
  3. public $vertexs;
  4. public $arc;
  5. public $num=5;
  6. }
  7. $G=new Graph();
  8. for($i=0;$i<$G->num;$i++){
  9. $G->vertexs[$i]="V{$i}";
  10. }
  11. $G->arc[1][0]=9;
  12. $G->arc[1][2]=3;
  13. $G->arc[2][0]=2;
  14. $G->arc[2][3]=5;
  15. $G->arc[3][4]=1;
  16. $G->arc[0][4]=6;
  17. //广度优先遍历
  18. function BFS($G){
  19. $res=array();
  20. $queue=array();
  21. for($i=0;$i<$G->num;$i++){
  22. $visited[$i]=false;
  23. }
  24. for($i=0;$i<$G->num;$i++){
  25. if($visited[$i]){
  26. break;
  27. }
  28. $visited[$i]=true;
  29. $res[]=$G->vertexs[$i];
  30. array_push($queue,$i);
  31. while(!empty($queue)){
  32. $v=array_pop($queue);
  33. for($j=0;$j<$G->num;$j++){
  34. if($G->arc[$v][$j]>0 && !$visited[$j]){
  35. $visited[$j]=true;
  36. $res[]=$G->vertexs[$j];
  37. array_push($queue,$j);
  38. }
  39. }
  40. }
  41. }
  42. return $res;
  43. }
  44. //深度优先遍历
  45. function DFS($G,$i){
  46. static $res;
  47. static $visited;
  48. if(!$visited[$i]){
  49. $visited[$i]=true;
  50. $res[]=$G->vertexs[$i];
  51. }
  52. for($j=0;$j<$G->num;$j++){
  53. if($G->arc[$i][$j]>0 && !$visited[$j]){
  54. $visited[$j]=true;
  55. $res[]=$G->vertexs[$j];
  56. DFS($G,$j);
  57. }
  58. }
  59. return $res;
  60. }
  61. $b=BFS($G);
  62. $d=DFS($G,1);
  63. var_dump($b);
  64. var_dump($d);

 

  1. array(5) {
  2. [0]=>
  3. string(2) "V0"
  4. [1]=>
  5. string(2) "V4"
  6. [2]=>
  7. string(2) "V1"
  8. [3]=>
  9. string(2) "V2"
  10. [4]=>
  11. string(2) "V3"
  12. }
  13. array(5) {
  14. [0]=>
  15. string(2) "V1"
  16. [1]=>
  17. string(2) "V0"
  18. [2]=>
  19. string(2) "V4"
  20. [3]=>
  21. string(2) "V2"
  22. [4]=>
  23. string(2) "V3"
  24. }

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号