本人愚钝,看别人写的广度优先算法不明白.自己写了一个,方对书上的讲解有了一些理解.
不过,我感觉别人看我的代码只怕也不明白吧
Node.java
import java.util.HashMap;
import java.util.Map;
public class Node {
public Node(char name){
this.name = name;
}
public char name;
public Map<Node,Integer> roads = new HashMap<Node, Integer>();
}
Main.java
import java.util.HashMap;import java.util.HashSet;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
Node a = new Node('a');
Node b = new Node('b');
Node c = new Node('c');
Node d = new Node('d');
Node e = new Node('e');
Node f = new Node('f');
Node g = new Node('g');
Node h = new Node('h');
Node i = new Node('i');
Node j = new Node('j');
Node k = new Node('k');
Node l = new Node('l');
a.roads.put(b, 4);
a.roads.put(f, 3);
b.roads.put(c, 3);
c.roads.put(d, 6);
d.roads.put(h, 4);
e.roads.put(f, 1);
f.roads.put(g, 5);
f.roads.put(k, 7);
g.roads.put(h, 7);
h.roads.put(l, 6);
i.roads.put(j, 4);
j.roads.put(k, 5);
k.roads.put(l, 3);
Set<Node> nodes = new HashSet<Node>();
nodes.add(a);
nodes.add(b);
nodes.add(c);
nodes.add(d);
// 定义源节点
Node source = a;
// 到各个定点的最短距离
Map<Node, Integer> shortRoads = new HashMap<Node, Integer>();
// 需要查找的NODE
Set<Node> needSearchs = source.roads.keySet();
// 初始化阶段
for (Node n : needSearchs) {
shortRoads.put(n, source.roads.get(n));
}
// 循环查找
while (needSearchs.size() != 0) {
Set<Node> needSearchsNew = new HashSet<Node>();
for (Node nodeInSearch : needSearchs) {
for (Node nodeOutside : nodeInSearch.roads.keySet()) {
if (nodeOutside != source) {
// 如果最短路径没有包含nodeOutside
if (!shortRoads.containsKey(nodeOutside)) {
shortRoads.put(nodeOutside,
shortRoads.get(nodeInSearch) == null ? 0 : shortRoads.get(nodeInSearch)
+ nodeInSearch.roads.get(nodeOutside));
}// 如果已经有nodeOutside了
else {
if (shortRoads.get(nodeOutside) > shortRoads.get(nodeInSearch)
+ nodeInSearch.roads.get(nodeOutside)) {
shortRoads.put(nodeOutside,
shortRoads.get(nodeInSearch) + nodeInSearch.roads.get(nodeOutside));
}
}
needSearchsNew.add(nodeOutside);
}
}
}
// 设置needsearchs
needSearchs = needSearchsNew;
}
// 输出最短距离
for (Entry<Node, Integer> n : shortRoads.entrySet()) {
System.out.println(n.getKey().name + "->" + n.getValue());
}
}
}
}