@LIUHUAN
2019-09-03T05:12:42.000000Z
字数 4657
阅读 1041
algorithm
标签(空格分隔): algorithm
void traveralGraph(){初始化标志hashmapfor node in G: // 对图中的每一个节点如果没有被访问:hashmap[node] == false执行DFS DFS(G,node,hashmap)}void DFS(G,node,hashmap){// 递归的出口如果节点被访问了:if hashmap[node] == true:返回: return1.访问节点:visited(node)2.标志节点已被访问:hashmap[node] = true3.获取node节点的旁边,邻接节点集合:adjlist = getadjList(node)for adjNode : adjlist: 对每一个邻接点,执行1).如果邻接点没有被访问:hashmap[adjNode] != true2).以这个节点开始,进行DFS遍历 :DFS(G,adjNode,hashmap)}}
A --- B --- C|D|E
| | | | | C | | | | D | | | | E | | || | --> | B | -> | B | -> | B | | B | | B | | B | |B|| A | | A | | A | | A | | A | | A | | A | |A|—————DFS(A) ->DFS(B) -> for n in (D,C)DFS(C)DFS(D) DFS(C)返回DFS(D)DFS(D)返回DFS(E)DFS(E)返回DFS(B)返回DFS(A)返回
public class DFSMethod {public static void main(String[] args){G = new Graph();hashmap = new hashmap();for node in G:if hashmap[node] == false:DFS(G,node,hashmap);// 表示从0 节点开始遍历}public static void BFS(G,node,hashmap) {//1.已经认为是在队列当中,说明已经要被访问了,所以这么标志visitedMap.put(node, true);//2.访问visited(node);// 3.获取相邻的节点ArrayList<Node> adjNodeList = G.getAdjectList(q);// 4.开始以邻接点为七点执行DFS搜索for(int i = 0; i < adjNodeList.size() ; ++i) {node = adjNodelist.get(i)/**没有被访问过,则以这个节点开始执行DFS搜索*/if (visitedMap[node] == false) { // 没有被访问过DFS(g,node,hashmap);}}//end for}public static void visited(Node s) {// 这里只是简单的打印一下,可进行性统计、计数等操作System.out.println(s);}}
[[0,0,1,0,0,0,0,1,0,0,0,0,0],[0,0,0,0,0,0,0,1,1,1,0,0,0],[0,1,1,0,1,0,0,0,0,0,0,0,0],[0,1,0,0,1,1,0,0,1*,0, 1*,0,0],[0,1,0,0,1,1,0,0,1*,1*,1*,0,0],[0,0,0,0,0,0,0,0,0,0,1*,0,0],[0,0,0,0,0,0,0,1,1,1,0,0,0],[0,0,0,0,0,0,0,1,1,0,0,0,0]]上述中有个连通分量(带*的1),大小为6
/**** x,y 坐标的相邻坐标* (x-1,y-1)---(x-1,y)----(x,y-1)* (x , y-1)---(x , y)----(x,y+1)* (x+1,y-1)---(x+1,y)----(x+1,y+1)*/public static int visitedCount = 0;public static int maxAreaOfIsland(int[][] grid) {//访问标志HashMap<String,Boolean> visitedMap = new HashMap<String,Boolean>();int count = 0;for(int x =0; x < grid.length; ++x) {for(int y = 0; y < grid[0].length; ++y) {if(grid[x][y] == 0)// 跳过非连通节点continue;String xykey = x + ":" + y;if(visitedMap.containsKey(xykey) == false) {DFS(grid,visitedMap,x,y);// 把连通的岛遍历一下,并标志下,visitedCount记录这个连通分量节点数count = count > visitedCount ? count : visitedCount;visitedCount = 0;// 下一个连通分量遍历}}}return count;}public static void DFS(int[][] grid,HashMap<String,Boolean> visitedMap,int startx,int starty) {NodeValue e = new NodeValue(startx, starty);//访问标志visitedMap.put(startx + ":" + starty, true);visited(e);/*获取邻接点集合*/ArrayList<NodeValue> adjlist = getAdjList(grid,e);// 邻接点调用DFSfor(int i = 0 ;i < adjlist.size(); ++i) {e = adjlist.get(i);String ekey = e.x +":" + e.y;if(visitedMap.containsKey(ekey) == false) {DFS(grid,visitedMap,e.x,e.y);}}}private static void visited(NodeValue e) {visitedCount ++;// 访问到的节点数增加,计数功能}/**寻找其相邻节点的函数*/public static ArrayList<NodeValue> getAdjList(int[][] grid,NodeValue e) {ArrayList<NodeValue> adjlist = new ArrayList<NodeValue>();int xlen = grid.length;int ylen = grid[0].length;if(e.x - 1 >=0 ) { // 上面(x-1,y)if (grid[e.x -1][e.y] == 1) {adjlist.add(new NodeValue(e.x - 1,e.y));}}if(e.y - 1 >=0 ) { //左面(x,y-1)if (grid[e.x][e.y - 1 ] == 1) {adjlist.add(new NodeValue(e.x,e.y - 1 ));}}if(e.x + 1 < xlen ) { // 下面 (x+1,y)if (grid[e.x + 1][e.y] == 1) {adjlist.add(new NodeValue(e.x + 1,e.y));}}if(e.y + 1 < ylen ) { // 右面(x,y+1)if (grid[e.x ][e.y + 1] == 1) {adjlist.add(new NodeValue(e.x,e.y + 1));}}return adjlist;}/**存储下x,y的坐标*/static class NodeValue{public int x, y;public NodeValue(int x,int y){this.x = x;this.y = y;}}