广度优先算法

2 篇文章 0 订阅
2 篇文章 0 订阅

本人愚钝,看别人写的广度优先算法不明白.自己写了一个,方对书上的讲解有了一些理解.

不过,我感觉别人看我的代码只怕也不明白吧

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());
}
}
}


}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值