地图绘制和四色算法,图搜索算法,最小生成树算法,最短路径算法
生活随笔
收集整理的這篇文章主要介紹了
地图绘制和四色算法,图搜索算法,最小生成树算法,最短路径算法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
基于簡易Web墨卡托計算實現地圖繪制,四色染色,實現圖的深度優先搜索,廣度優先搜索,Kruskal算法最小生成樹,Prime算法最小生成樹,Dijkstra最短路徑算法。
使用Java & Swing開發
基于簡易Web墨卡托計算,地圖繪制
四色定理染色:
// 四色算法public void fill() {LinkedList<INode> source = (LinkedList<INode>)__nodes.clone();LinkedList<INode> target = new LinkedList<>();while (source.isEmpty() == false) {INode node = source.pop();target.push(node);boolean bContinue = false;do {INode top = target.peek();Color c = findColor(top);if (c == null) {INode n = target.pop();n.setColor(null);source.push(n);continue ;}top.setColor(c);bContinue = ! detect(top);} while (bContinue == false);}}BFS優先搜索算法
// 廣度優先搜索public void bfs() {LinkedList<INode> all = (LinkedList<INode>)__nodes.clone();LinkedList<INode> q = new LinkedList<>();while (all.isEmpty() == false) {INode node = all.removeFirst();q.add(node);int p = 0;while (p < q.size()) {INode n = q.get(p);for (INode n1 : n.getChildren()) {boolean b = all.remove(n1);if (b)q.add(n1);}p++;}}__nodes.clear();__nodes.addAll(q);}?
DFS深度優先搜索算法:
// 深度優先搜索public void dfs() {LinkedList<INode> all = (LinkedList<INode>)__nodes.clone();LinkedList<INode> q = new LinkedList<>();while (all.isEmpty() == false) {INode node = all.removeFirst();q.add(node);_dfs(all, q, node);}__nodes.clear();__nodes.addAll(q);}private void _dfs(LinkedList<INode> all, LinkedList<INode> target, INode c) {for (INode n : c.getChildren()) {boolean b = all.remove(n);if (b) {target.add(n);_dfs(all, target, n);}}}Kruskal最小生成樹:
public List<Edge> Kruskal() {HashSet<Edge> _edges = buildEdge();LinkedList<Edge> edges = new LinkedList<>();edges.addAll(_edges);Collections.sort(edges, new Comparator<Edge>() {@Overridepublic int compare(Edge o1, Edge o2) {return o1.compareTo(o2);}});List<HashSet<INode>> range = new LinkedList<>();LinkedList<Edge> r = new LinkedList<>();for (Edge edge : edges) {HashSet<INode> s1 = null;HashSet<INode> s2 = null;for (HashSet<INode> s : range) {if (s.contains(edge.n1) == true) {s1 = s;}if (s.contains(edge.n2) == true) {s2 = s;}if (s1 != null && s2 != null)break ;}if (s1 != null && s2 != null) {if (s1 == s2)continue ;else {HashSet<INode> s = new HashSet<>();s.addAll(s1);s.addAll(s2);range.remove(s1);range.remove(s2);range.add(s);r.add(edge);}}if (s1 == null && s2 == null) {HashSet<INode> s = new HashSet<>();s.add(edge.n1);s.add(edge.n2);range.add(s);r.add(edge);}if (s1 != null && s2 == null) {s1.add(edge.n2);r.add(edge);}if (s1 == null && s2 != null) {s2.add(edge.n1);r.add(edge);}}return r;}Prime最小生成樹
public List<Edge> Prime() {LinkedList<Edge> r = new LinkedList<>();LinkedList<INode> range = new LinkedList<>();range.add( this.randomNode() );while (true) {int min = -1;Edge minEdge = null;for (INode node : range) {for (INode child : node.getChildren()) {if (range.contains(child) == false) {Edge edge = new Edge(node, child);int w = Edge.getDistance(node, child);if (minEdge == null) {minEdge = edge;min = w;}else if (w < min) {minEdge = edge;min = w;}}}}if (minEdge != null) {range.add(minEdge.n1);range.add(minEdge.n2);r.add(minEdge);}elsebreak ;}return r;}Dijkstra算法
// Dijkstra算法public List<Edge> Dijkstra() {for (int i=0; i<__nodes.size(); i++) {__nodes.get(i).setWeight(-1);}HashSet<Edge> edges = buildEdge();LinkedList<Edge> r = new LinkedList<>();LinkedList<INode> s = new LinkedList<>();LinkedList<INode> all = (LinkedList<INode>) __nodes.clone();INode starter = randomNode();starter.setWeight( 0 );s.add(starter);all.remove(starter);while (all.isEmpty() == false) {INode minNode = null;int minWeight = -1;Edge e = null;for (INode n1 : all) {for (INode n2 : s) {Edge edge = findEdge(edges, n1, n2);if (edge != null) {int d = n2.getWeight() + edge.getDistance();if (minNode == null) {minNode = n1;minWeight =d;e = edge;}else if (d < minWeight) {minNode = n1;minWeight = d;e = edge;}}}}if (minNode != null) {minNode.setWeight(minWeight);s.add(minNode);all.remove(minNode);r.add(e);}elsebreak;}return r;}總結
以上是生活随笔為你收集整理的地图绘制和四色算法,图搜索算法,最小生成树算法,最短路径算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 框架学习——带你了解SpringBoot
- 下一篇: C++ 头插法建立单链表,单链表原地逆置