利用广度优先的搜索方法写了一个最短路径的例子,自我感觉还可以优化,因为最后显示的结果不是很人性化
节点类Vertex、边类Edge、图类Graph前几篇已经写了,这里作相应的修改,在节点Vertex类中添加路径长度pathLength变量和上一个节点的名称path变量,初始pathLength为0,path为null.
利用这种方法可以计算出从某节点为起点的到达所有节点的最短路径,其中pathLength表示了路径长度,而path则可以一层层找到该路径。
下面贴上代码和结果:
/*
* 无权最短路径算法,利用广度优先搜索方法
*/
package com.Algorithm.ShortestPath;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Scanner;
public class ShortestPathTest {
Graph g ;
//构造函数
public ShortestPathTest()
{
g = new Graph();
g.buildGraph();
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ShortestPathTest s = new ShortestPathTest();
System.out.println("输入路径的起点:");
Scanner input = new Scanner(System.in);
String first = input.next();
input.next();
s.shortestPath(first);
}
public void shortestPath(String first)
{
LinkedList<Vertex> queue = new LinkedList<Vertex>();
Vertex firstVertex = g.v[g.findvIndex(first)];
firstVertex.setIsVisted(true);
int counter = 0;
firstVertex.setPathlength(counter);
queue.add(firstVertex);
System.out.println("最短路径为:");
String path;
while(!queue.isEmpty())
{
Vertex v = queue.poll();
//得到队顶的path和Counter,用于下面for循环的赋值
path = v.getFrom();
counter = v.getPathlength();
System.out.println( v.getFrom()+"的路径长度为 "+v.getPathlength()+",上一个节点是"+v.path+" ");
ArrayList<Vertex> al = g.getAdjacentVertex(v);
for( Vertex vertex : al )
{
if(!(vertex.getIsVisted()))//没被访问过
{
vertex.setIsVisted(true);
vertex.setPathlength(counter+1);
vertex.setPath(path);
queue.add(vertex);
}
}
}
}
}
结果为:
图:
输入顶点数和边数:7 6
输入顶点名称:
a b c d e f g
输入起点和终点:a b
输入起点和终点:b c
输入起点和终点:b e
输入起点和终点:b f
输入起点和终点:c d
输入起点和终点:e g
输入路径的起点:
a g
最短路径为:
a的路径长度为 0,上一个节点是null
b的路径长度为 1,上一个节点是a
f的路径长度为 2,上一个节点是b
e的路径长度为 2,上一个节点是b
c的路径长度为 2,上一个节点是b
g的路径长度为 3,上一个节点是e
d的路径长度为 3,上一个节点是c