示例:
运行结果:
[PathAndValue(path=[0, 3, 2, 4], value=60),
PathAndValue(path=[0, 1, 2, 4], value=70),
PathAndValue(path=[0, 4], value=100)]
import lombok.Data;
import java.util.ArrayList;
import java.util.TreeSet;
/**
* 输入邻接矩阵
* 输出规定节点到节点的路径及路径的权重之和
*/
public class GetPathValue {
static Integer M = -1;
// 邻接矩阵
static int[][] Graph = {
{0,10,M,30,100},
{M,0,50,M,M},
{M,M,0,M,10},
{M,M,20,0,60},
{M,M,M,M,0}
};
// 顶点个数
static int G_length = Graph.length;
// visit数组,用于在dfs中记录访问过的顶点信息。
static int[] visit = new int[G_length];
// 存储每条可能的路径
static ArrayList<Integer> path = new ArrayList<>();
// 用于存储所有路径的集合,按路径之和升序排列
static TreeSet<PathAndValue> ans =new TreeSet<>((o1, o2) -> o1.getValue()-o2.getValue());
// 起点和终点
static int startNode;
static int endNode;
// 每条路径的权重之和
static int sum;
// 深度优先搜索
static void dfs(int nowNode){
// 先将该节点置为已访问
visit[nowNode] = 1;
// 先将该节点存放在可能的路径中
path.add(nowNode);
// 如果开始节点等于终止节点,就找到一条路径,将该路径存在最终的路径集合中
if(nowNode == endNode){
PathAndValue pathAndValue = new PathAndValue();
pathAndValue.setPath(path.toString());
pathAndValue.setValue(sum);
ans.add(pathAndValue);
// 如果还没有搜索到终止节点,就将现在没有访问过的节点进行访问,且这些节点需要与现在的节点相邻
}else{
for (int i = 0; i < G_length; i++) {
if(visit[i]==0 && i!=nowNode && Graph[nowNode][i]!=M){
// 遍历的节点与现在的节点相邻,就将权重值加上
sum += Graph[nowNode][i];
// 递归调用
dfs(i);
}
}
}
// 因为是递归调用,所以每次将以下值进行恢复
path.remove(path.size()-1);
visit[nowNode] = 0;
sum=0;
}
public static void main(String[] args) {
// 起始节点
startNode = 0;
// 终止节点
endNode = 4;
dfs(startNode);
System.out.println(ans);
}
}
@Data
class PathAndValue{
private String path;
private Integer value;
}