计算两点之间所有路径,支持有向图、无向图

这是一个你可能用的到的路径算法:输入一个起点A,一个终点D,计算所有路径

//加所有的边:
PathDfs pathDfs = new PathDfs(true); //true表是否是无向图
pathDfs.addEdge("A", "B");
pathDfs.addEdge("B", "C");
pathDfs.addEdge("C", "D");
pathDfs.addEdge("B", "E");
pathDfs.addEdge("E", "D");
List<String> findAllPath = pathDfs.findAllPath("A", "D");
System.out.println(findAllPath);
  • 全部代码
package com.ruoyi.analysis.dfs;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * 路线算法
 * 
 * @author ZJ
 *
 */
public class PathDfs {

	// 是否是无向图
	private boolean noDirect = false;
	// 定义一个图
	private int[][] Graph = null;
	// 边
	private List<List<String>> edges = new ArrayList<>();
	// 顶点
	private List<String> vertex = new ArrayList<>();
	// visit数组,用于在dfs中记录访问过的顶点信息。
	private int[] visit = null;
	// 存储每条可能的路径
	private List<String> path = new ArrayList<>();
	// 用于存储所有路径的集合
	private List<String> ans = new ArrayList<>();
	// 起点和终点
	private int start;
	private int end;

	public PathDfs() {
		super();
	}

	public PathDfs(boolean noDirect) {
		super();
		this.noDirect = noDirect;
	}

	public boolean isNoDirect() {
		return noDirect;
	}

	public void setNoDirect(boolean noDirect) {
		this.noDirect = noDirect;
	}

	/**
	 * 寻找两点之间所有路线
	 * @param start 起点
	 * @param end 终点
	 * @return 
	 */
	public List<String> findAllPath(String start, String end) {
		//通过边获取顶点
		initVertex();
		//构建邻接矩阵图
		buildGraph();
		//顶点转换下标
		visit = new int[vertex.size()];
		this.start = vertex.indexOf(start);
		this.end = vertex.indexOf(end);
		dfs(this.start);
		
		return this.ans;
	}

	/**
	 * 
	 */
	private void dfs(int u) {
		visit[u] = 1;
		path.add(vertex.get(u));
		if (u == end) {
			ans.add(path.toString());
		} else {
			for (int i = 0; i < vertex.size(); i++) {
				if (visit[i] == 0 && i != u && Graph[u][i] == 1) {
					dfs(i);
				}
			}
		}
		path.remove(path.size() - 1);
		visit[u] = 0;
	}

	/**
	 * 获取所有路线
	 * @return
	 */
	public List<String> getAllPath() {
		return this.ans;
	}

	/**
	 * 添加边
	 * @param v1 边的起点
	 * @param v2 边的终点
	 */
	public void addEdge(String v1, String v2) {
		edges.add(Arrays.asList(v1, v2));
	}

	/**
	 * 初始化顶点
	 */
	private void initVertex() {
		Set<String> set = new HashSet<String>();
		for (List<String> edge : edges) {
			set.add(edge.get(0));
			set.add(edge.get(1));
		}
		for (String string : set) {
			vertex.add(string);
		}
	}

	/**
	 * 构建邻接矩阵图
	 */
	private void buildGraph() {
		Graph = new int[vertex.size()][vertex.size()];

		for (int i = 0; i < edges.size(); i++) {
			List<String> edge = edges.get(i);
			String ss = edge.get(0);
			String ee = edge.get(1);
			Graph[vertex.indexOf(ss)][vertex.indexOf(ee)] = 1;
			if (noDirect) {
				Graph[vertex.indexOf(ee)][vertex.indexOf(ss)] = 1;
			}
		}
	}

	public static void main(String[] args) {
		PathDfs pathDfs = new PathDfs(true);
		pathDfs.addEdge("A", "B");
		pathDfs.addEdge("B", "C");
		pathDfs.addEdge("C", "D");
		pathDfs.addEdge("B", "E");
		pathDfs.addEdge("E", "D");

		List<String> findAllPath = pathDfs.findAllPath("A", "D");
		System.out.println(findAllPath);
	}
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值