日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

地图绘制和四色算法,图搜索算法,最小生成树算法,最短路径算法

發布時間:2023/12/31 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 地图绘制和四色算法,图搜索算法,最小生成树算法,最短路径算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

基于簡易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;}

總結

以上是生活随笔為你收集整理的地图绘制和四色算法,图搜索算法,最小生成树算法,最短路径算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。