有向图的寻径算法(dfs)

最近需要完成一个点之间寻径的任务。基本可以抽象为有向图的寻径,于是复习一下。
有向图的存储方法有两种,邻接表或者邻接矩阵,对于点来说,总的点数目较多且单个点的相邻点数目不会太多,所以选择用邻接表来实现。后续可能会引入点间距离(权重),故选用dfs方式

public class Line {

	public String start;

	public String end;

	public String getStart() {
		return start;
	}

	public void setStart(String start) {
		this.start = start;
	}

	public String getEnd() {
		return end;
	}

	public void setEnd(String end) {
		this.end = end;
	}

	public Line(String start,String end) {
		this.start=start;
		this.end=end;
	}

}
//构建邻接表   使用的是String故使用Map若是转换为int 使用数组更佳
	private static List> getAllRoad(String start, String end, List datas) {		
		Map> ljb = new HashMap>(6);
		for (Line line : datas) {
			if (ljb.containsKey(line.start)) {
				ljb.get(line.start).add(line.end);
			} else {
				List li = new ArrayList();
				li.add(line.end);
				ljb.put(line.start, li);
			}
		}
		Set hs=new HashSet();//已达缓存
		List> result = new ArrayList>();//全路径记录
		List re = new ArrayList();//已达节点记录
		res(result, ljb,re, start, end,hs);
		return result;
	}

	private static  void res(List> result,Map> ljb,List re,String start,String end,Set has) {
		if(has.contains(start)) {//即已经到达过 对应环状结构
			return;
		}
		if(start.equals(end)) {//即匹配到节点
			List res =new ArrayList();
			res.addAll(re);
			res.add(start);
			result.add(res);
			return;
		}
		
		re.add(start);//记录状态
		has.add(start);
		
		if(ljb.containsKey(start)) {//继续向下递归调用
			for(String str :ljb.get(start)) {				
				res(result, ljb,re, str, end, has);
			}			
		}
		re.remove(re.size()-1);//退出还原状态
		has.remove(start);//同时需要清楚已达标记
	}

测试一下

public static void main(String[] args) {
		List lines = new ArrayList();
		lines.add(new Line("A", "B"));
		lines.add(new Line("A", "C"));
		lines.add(new Line("A", "D"));
		lines.add(new Line("C", "D"));
		lines.add(new Line("D", "E"));
		lines.add(new Line("E", "F"));
		lines.add(new Line("C", "F"));
		List> roads = getAllRoad("A", "F", lines);
		System.out.println(roads);
	}

有向图的寻径算法(dfs)_第1张图片
基本效果实现

你可能感兴趣的:(数据结构,小需求)