问题的描述是这样的:有一个有向无权图G,指定一个特定的顶点s作为起点,要求找出从s出发到G中的每一个其它顶点的最短路径。
package com.gloomy.graph;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.List;
import java.util.Queue;
/**
* 无权最短路径
*
* @author 过路的守望
*
*/
public class UnweightPathLength {
public static void main(String[] args) {
Vertex A = new Vertex("A");
Vertex B = new Vertex("B");
Vertex C = new Vertex("C");
Vertex D = new Vertex("D");
Vertex E = new Vertex("E");
Vertex F = new Vertex("F");
Vertex G = new Vertex("G");
A.getAdjacentList().add(B);
A.getAdjacentList().add(D);
B.getAdjacentList().add(D);
B.getAdjacentList().add(E);
C.getAdjacentList().add(A);
C.getAdjacentList().add(F);
D.getAdjacentList().add(C);
D.getAdjacentList().add(E);
D.getAdjacentList().add(F);
D.getAdjacentList().add(G);
E.getAdjacentList().add(G);
G.getAdjacentList().add(F);
UnweightPathLength unweightPathLength = new UnweightPathLength();
unweightPathLength.unweightedPath(C);
}
/**
* 无权最短路径-广度优先遍历
* 时间复杂度O(E+V)
* @param s
*/
public void unweightedPath(Vertex s) {
if (s == null) {
return;
}
Queue<Vertex> queue = new ArrayDeque<Vertex>();
/*
* 选择s为起点
*/
s.setDist(0);
queue.offer(s);
Vertex curVertex = s;
while (!queue.isEmpty()) {
curVertex = queue.poll();
for (Vertex vertex : curVertex.getAdjacentList()) {
if (vertex.getDist() == Integer.MAX_VALUE) {
//更新路径长度
vertex.setDist(curVertex.getDist() + 1);
vertex.setPreVertex(curVertex);
queue.offer(vertex);
}
}
}
while (curVertex != null) {
System.out.print(curVertex.getLabel() + "-->");
curVertex = curVertex.getPreVertex();
}
}
}
class Vertex {
/*
* 路径距离
*/
private int dist = Integer.MAX_VALUE;
/*
* 前继顶点
*/
private Vertex preVertex;
/*
* 邻接表
*/
private List<Vertex> adjacentList;
/*
* 标签
*/
private String label;
public Vertex(String label) {
super();
this.adjacentList = new ArrayList<Vertex>();
this.label = label;
}
public List<Vertex> getAdjacentList() {
return adjacentList;
}
public int getDist() {
return dist;
}
public String getLabel() {
return label;
}
public Vertex getPreVertex() {
return preVertex;
}
public void setAdjacentList(List<Vertex> adjacentList) {
this.adjacentList = adjacentList;
}
public void setDist(int dist) {
this.dist = dist;
}
public void setLabel(String label) {
this.label = label;
}
public void setPreVertex(Vertex preVertex) {
this.preVertex = preVertex;
}
}