概念
最短路径最直接的例子就是导航软件的,从一个地方到另一个地方的路径。要实现最短路径算法,一般使用一个加权有向图。即找到一个顶点到另一个顶点权重最小的有向路径。
基本的数据结构
带权有向图的数据结构和带权无向图差不多,只是添加边的时候不添加一条双向的边。
/**
* 加权有向图
* @author yuli
*
*/
public class EdgeWeightedDiGraph {
private final int v;//顶点数
private int e;//边数
private List<Edge>[] adj;//邻接表
@SuppressWarnings("unchecked")
public EdgeWeightedDiGraph(int v,int e) {
this.v = v;
adj = new LinkedList[v];
for(int i=0;i<v;i++){
adj[i] = new LinkedList<Edge>();
}
}
@SuppressWarnings("unchecked")
public EdgeWeightedDiGraph(File file) throws IOException{
FileReader fr = new FileReader(file);
BufferedReader br = new BufferedReader(fr);
int vertex = Integer.parseInt(br.readLine());//读取顶点数
this.v = vertex;//读取顶点数
//创建有顶点数的邻接表
adj = new LinkedList[vertex];
for(int i=0;i<vertex;i++){
adj[i] = new LinkedList<>();
}
int edge = Integer.parseInt(br.readLine());//读取边
for(int i=0;i<edge;i++){
//获取顶点对
String[] vertexs = br.readLine().split(" ");
int v = Integer.parseInt(vertexs[0]);
int m = Integer.parseInt(vertexs[1]);
double weight = Double.parseDouble(vertexs[2]);
//生成加权边
Edge e = new Edge(v, m, weight);
//将顶点对添加成一条边
addEdge(e);
}
if(br!= null){
br.close();
}
}
/**
* 获取边数
* @return
*/
public int getE() {
return e;
}
/**
* 获取顶点数
* @return
*/
public int getV() {
return v;
}
/**
* 添加一条有向边
* @param v
* @param m
* @param e
*/
private void addEdge(Edge e){
adj[e.getV()].add(e);
this.e++;
}
/**
* 获取邻接点
* @param v
* @return
*/
public Iterable<Edge> adj(int v){
return adj[v];
}
/**
* 获取所有边
* @return
*/
public Iterable<Edge> edges(){
List<Edge> edges = new ArrayList<>();
for (List<Edge> list : adj) {
edges.addAll(list);
}
return edges;
}
}