深度优先搜索(dfs、深搜)java实现-数据结构和算法

2019
0 21

上一篇:广度优先搜索算法(bfs、广搜)java实现-数据结构和算法

用邻接矩阵表示图的定点之间的关系

如下图数据结构

则用邻接矩阵表示为:

	private static int map[][]={
	  {0  ,3  ,6  ,-1 ,-1 ,-1 ,-1 ,-1,-1,-1,-1},
	  {3  ,0  ,-1 ,4  ,1  ,-1 ,-1 ,-1,3 ,-1,-1},
	  {6  ,-1 ,0  ,-1 ,-1 ,-1 ,-1 ,3 ,-1,-1,-1},
	  {-1 ,4  ,-1 ,0  ,3  ,-1 ,-1 ,6 ,-1,-1,-1},
	  {-1 ,1  ,-1 ,3  ,0  ,5  ,-1 ,-1,-1,-1,-1},
	  {-1 ,-1 ,-1 ,-1 ,5  ,0  ,2  ,-1,-1, 3, 3},
	  {-1 ,-1 ,-1 ,-1 ,-1 ,2  ,0  ,1 ,-1,-1,-1},
	  {-1 ,-1 ,3  ,6  ,-1 ,-1 ,1  ,0 ,-1,-1,-1},
	  {-1 ,3  ,-1 ,-1 ,-1 ,-1 ,-1 ,-1,0 ,-1,-1},
	  {-1 ,-1 ,-1 ,-1 ,-1 ,3  ,-1 ,-1,-1,0 ,3 },
	  {-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1,-1,3 ,0 }
	};

横坐标和纵坐标代表第n个节点,值>0代表两个节点相连,并且值代表两个节点之间的权值(暂时没有用到),-1代表两个节点之间不相连。

算法和思路:
  • 1.从第一个节点开始当作当前节点
  • 2.遍历当前节的所有没有被标记的子节点
  • 3.如果有[没有被标记的子节点,则把当前节点入栈,把子节点赋值给当前节点,继续过程2。否则,判断栈中是否含有元素,如果含有,则取出一个元素继续过程2,否则结束遍历 
java代码实现: 
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Set;

public class Test {
	/**
	 * 	邻接矩阵表示的图 的二维数组
	 * 	横坐标和纵坐标代表第n个节点,值>0代表两个节点相连,并且值代表两个节点之间的权值(暂时没有用到),
	 * 	-1代表两个节点之间不相连
	 */
	private static int map[][]={
	  {0  ,3  ,6  ,-1 ,-1 ,-1 ,-1 ,-1,-1,-1,-1},
	  {3  ,0  ,-1 ,4  ,1  ,-1 ,-1 ,-1,3 ,-1,-1},
	  {6  ,-1 ,0  ,-1 ,-1 ,-1 ,-1 ,3 ,-1,-1,-1},
	  {-1 ,4  ,-1 ,0  ,3  ,-1 ,-1 ,6 ,-1,-1,-1},
	  {-1 ,1  ,-1 ,3  ,0  ,5  ,-1 ,-1,-1,-1,-1},
	  {-1 ,-1 ,-1 ,-1 ,5  ,0  ,2  ,-1,-1, 3, 3},
	  {-1 ,-1 ,-1 ,-1 ,-1 ,2  ,0  ,1 ,-1,-1,-1},
	  {-1 ,-1 ,3  ,6  ,-1 ,-1 ,1  ,0 ,-1,-1,-1},
	  {-1 ,3  ,-1 ,-1 ,-1 ,-1 ,-1 ,-1,0 ,-1,-1},
	  {-1 ,-1 ,-1 ,-1 ,-1 ,3  ,-1 ,-1,-1,0 ,3 },
	  {-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1,-1,3 ,0 }
	};
	
	public static void main(String[] args) {
		dfs();
	}
	/**
	 * 	深度优先搜索
	 * 	思路:
	 * 	1.从第一个节点开始当作当前节点
	 * 	2.遍历当前节的所有没有被标记的子节点
	 * 	3.如果有[没有被标记的子节点,则把当前节点入栈,把子节点赋值给当前节点,继续过程2。
	 * 		否则,判断栈中是否含有元素,如果含有,则取出一个元素继续过程2,否则结束遍历
	 */
	public static void dfs() {
		Set<Integer> set=new HashSet<Integer>();
		/**
		 * 存储经过的节点路径
		 */
		LinkedList<Integer> path=new LinkedList<Integer>();
		/**
		 * 	储存待遍历节点的栈
		 */
		LinkedList<Node> stack=new LinkedList<Node>();
		Node th=new Node(0, 0);//当前需要遍历的节点
		map[th.i][th.p]=-1;
		while(true) {
			int p;
			for(p=th.p;p<map.length;p++) {
				/**
				 * 	遍历当前节点的所有没有遍历过的子节点
				 */
				if(map[th.i][p]>0&&map[p][p]==0) {
					th.p=p+1;
					stack.addFirst(th);//当前节点入栈
					if(!set.contains(th.i)) {
						set.add(th.i);
						path.addFirst(th.i);
					}
					th=new Node(p,0);
					map[p][p]=-1;
					p=0;
				}
			}
			if(!set.contains(th.i)) {
				set.add(th.i);
				path.addFirst(th.i);
			}
			if(stack.size()>0) {
				th=stack.removeFirst();
			}else {
				break;
			}
		}
		while(path.size()>0){
			System.out.print(path.removeLast()+"\t");
		}
	}
	public static class Node{
		public Integer i;//当前元素i
		public Integer p;//当前遍历第p个元素
		public Node(int i,int p) {
			this.i=i;
			this.p=p;
		}
	}
}

 输出:

0	1	3	4	5	6	7	2	9	10	8	

 

留言(0)
加载更多
猜你喜欢