[关闭]
@LIUHUAN 2019-09-03T13:12:42.000000Z 字数 4657 阅读 845

DFS

algorithm


深度优先搜索算法(DFS)

标签(空格分隔): algorithm



  1. void traveralGraph(){
  2. 初始化标志hashmap
  3. for node in G: // 对图中的每一个节点
  4. 如果没有被访问:hashmap[node] == false
  5. 执行DFS DFS(G,node,hashmap)
  6. }
  7. void DFS(G,node,hashmap){
  8. // 递归的出口
  9. 如果节点被访问了:if hashmap[node] == true:
  10. 返回: return
  11. 1.访问节点:visited(node)
  12. 2.标志节点已被访问:hashmap[node] = true
  13. 3.获取node节点的旁边,邻接节点集合:adjlist = getadjList(node)
  14. for adjNode : adjlist: 对每一个邻接点,执行
  15. 1).如果邻接点没有被访问:hashmap[adjNode] != true
  16. 2).以这个节点开始,进行DFS遍历 :DFS(G,adjNode,hashmap)
  17. }
  18. }

  1. A --- B --- C
  2. |
  3. D
  4. |
  5. E
  1. | | | | | C | | | | D | | | | E | | |
  2. | | --> | B | -> | B | -> | B | | B | | B | | B | |B|
  3. | A | | A | | A | | A | | A | | A | | A | |A|
  4. —————
  5. DFS(A) ->
  6. DFS(B) -> for n in (D,C)
  7. DFS(C)
  8. DFS(D) DFS(C)返回
  9. DFS(D)
  10. DFS(D)返回
  11. DFS(E)
  12. DFS(E)返回
  13. DFS(B)返回
  14. DFS(A)返回

  1. public class DFSMethod {
  2. public static void main(String[] args){
  3. G = new Graph();
  4. hashmap = new hashmap();
  5. for node in G:
  6. if hashmap[node] == false:
  7. DFS(G,node,hashmap);// 表示从0 节点开始遍历
  8. }
  9. public static void BFS(G,node,hashmap) {
  10. //1.已经认为是在队列当中,说明已经要被访问了,所以这么标志
  11. visitedMap.put(node, true);
  12. //2.访问
  13. visited(node);
  14. // 3.获取相邻的节点
  15. ArrayList<Node> adjNodeList = G.getAdjectList(q);
  16. // 4.开始以邻接点为七点执行DFS搜索
  17. for(int i = 0; i < adjNodeList.size() ; ++i) {
  18. node = adjNodelist.get(i)
  19. /**没有被访问过,则以这个节点开始执行DFS搜索*/
  20. if (visitedMap[node] == false) { // 没有被访问过
  21. DFS(g,node,hashmap);
  22. }
  23. }//end for
  24. }
  25. public static void visited(Node s) {
  26. // 这里只是简单的打印一下,可进行性统计、计数等操作
  27. System.out.println(s);
  28. }
  29. }

2 图联通量的遍历

2.1 问题描述

  1. [[0,0,1,0,0,0,0,1,0,0,0,0,0],
  2. [0,0,0,0,0,0,0,1,1,1,0,0,0],
  3. [0,1,1,0,1,0,0,0,0,0,0,0,0],
  4. [0,1,0,0,1,1,0,0,1*,0, 1*,0,0],
  5. [0,1,0,0,1,1,0,0,1*,1*,1*,0,0],
  6. [0,0,0,0,0,0,0,0,0,0,1*,0,0],
  7. [0,0,0,0,0,0,0,1,1,1,0,0,0],
  8. [0,0,0,0,0,0,0,1,1,0,0,0,0]]
  9. 上述中有个连通分量(带*的1),大小为6

  1. /***
  2. * x,y 坐标的相邻坐标
  3. * (x-1,y-1)---(x-1,y)----(x,y-1)
  4. * (x , y-1)---(x , y)----(x,y+1)
  5. * (x+1,y-1)---(x+1,y)----(x+1,y+1)
  6. */
  7. public static int visitedCount = 0;
  8. public static int maxAreaOfIsland(int[][] grid) {
  9. //访问标志
  10. HashMap<String,Boolean> visitedMap = new HashMap<String,Boolean>();
  11. int count = 0;
  12. for(int x =0; x < grid.length; ++x) {
  13. for(int y = 0; y < grid[0].length; ++y) {
  14. if(grid[x][y] == 0)// 跳过非连通节点
  15. continue;
  16. String xykey = x + ":" + y;
  17. if(visitedMap.containsKey(xykey) == false) {
  18. DFS(grid,visitedMap,x,y);// 把连通的岛遍历一下,并标志下,visitedCount记录这个连通分量节点数
  19. count = count > visitedCount ? count : visitedCount;
  20. visitedCount = 0;// 下一个连通分量遍历
  21. }
  22. }
  23. }
  24. return count;
  25. }
  26. public static void DFS(int[][] grid,HashMap<String,Boolean> visitedMap,int startx,int starty) {
  27. NodeValue e = new NodeValue(startx, starty);
  28. //访问标志
  29. visitedMap.put(startx + ":" + starty, true);
  30. visited(e);
  31. /*获取邻接点集合*/
  32. ArrayList<NodeValue> adjlist = getAdjList(grid,e);
  33. // 邻接点调用DFS
  34. for(int i = 0 ;i < adjlist.size(); ++i) {
  35. e = adjlist.get(i);
  36. String ekey = e.x +":" + e.y;
  37. if(visitedMap.containsKey(ekey) == false) {
  38. DFS(grid,visitedMap,e.x,e.y);
  39. }
  40. }
  41. }
  42. private static void visited(NodeValue e) {
  43. visitedCount ++;// 访问到的节点数增加,计数功能
  44. }
  45. /**寻找其相邻节点的函数*/
  46. public static ArrayList<NodeValue> getAdjList(int[][] grid,NodeValue e) {
  47. ArrayList<NodeValue> adjlist = new ArrayList<NodeValue>();
  48. int xlen = grid.length;
  49. int ylen = grid[0].length;
  50. if(e.x - 1 >=0 ) { // 上面(x-1,y)
  51. if (grid[e.x -1][e.y] == 1) {
  52. adjlist.add(new NodeValue(e.x - 1,e.y));
  53. }
  54. }
  55. if(e.y - 1 >=0 ) { //左面(x,y-1)
  56. if (grid[e.x][e.y - 1 ] == 1) {
  57. adjlist.add(new NodeValue(e.x,e.y - 1 ));
  58. }
  59. }
  60. if(e.x + 1 < xlen ) { // 下面 (x+1,y)
  61. if (grid[e.x + 1][e.y] == 1) {
  62. adjlist.add(new NodeValue(e.x + 1,e.y));
  63. }
  64. }
  65. if(e.y + 1 < ylen ) { // 右面(x,y+1)
  66. if (grid[e.x ][e.y + 1] == 1) {
  67. adjlist.add(new NodeValue(e.x,e.y + 1));
  68. }
  69. }
  70. return adjlist;
  71. }
  72. /**存储下x,y的坐标*/
  73. static class NodeValue{
  74. public int x, y;
  75. public NodeValue(int x,int y){
  76. this.x = x;
  77. this.y = y;
  78. }
  79. }

3.参考内容:

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注