日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

Java实现图的深度和广度优先遍历算法

發(fā)布時間:2025/3/20 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java实现图的深度和广度优先遍历算法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

概述:

? 最近要學(xué)習(xí)寫網(wǎng)絡(luò)爬蟲,所以把圖的深度和廣度搜索都再溫習(xí)一下。


圖結(jié)構(gòu)展示:



實現(xiàn)過程:

首先,我們來看看圖結(jié)構(gòu)在代碼中的實現(xiàn)。有三塊邏輯:

1.圖中的節(jié)點(diǎn):

public class GraphNode {public List<GraphEdge> edgeList = null;private String label = "";public GraphNode(String label) {this.label = label;if (edgeList == null) {edgeList = new ArrayList<GraphEdge>();}}/*** 給當(dāng)前節(jié)點(diǎn)添加一條邊* GraphNode* @param edge* 添加的邊*/public void addEdgeList(GraphEdge edge) {edgeList.add(edge);}public String getLabel() {return label;} } ?

2.圖中的邊:

?

public class GraphEdge {private GraphNode nodeLeft;private GraphNode nodeRight;/*** @param nodeLeft* 邊的左端* @param nodeRight* 邊的右端*/public GraphEdge(GraphNode nodeLeft, GraphNode nodeRight) {this.nodeLeft = nodeLeft;this.nodeRight = nodeRight;}public GraphNode getNodeLeft() {return nodeLeft;}public GraphNode getNodeRight() {return nodeRight;}} ?

3.把節(jié)點(diǎn)和邊組合成一個圖結(jié)構(gòu):

?

public class MyGraph {private List<GraphNode> nodes = null;public void initGraph(int n) {if (nodes == null) {nodes = new ArrayList<GraphNode>();}GraphNode node = null;for (int i = 0; i < n; i++) {node = new GraphNode(String.valueOf(i));nodes.add(node);}}public void initGraph(int n, boolean b) {initGraph(n);GraphEdge edge01 = new GraphEdge(nodes.get(0), nodes.get(1));GraphEdge edge02 = new GraphEdge(nodes.get(0), nodes.get(2));GraphEdge edge13 = new GraphEdge(nodes.get(1), nodes.get(3));GraphEdge edge14 = new GraphEdge(nodes.get(1), nodes.get(4));GraphEdge edge25 = new GraphEdge(nodes.get(2), nodes.get(5));GraphEdge edge26 = new GraphEdge(nodes.get(2), nodes.get(6));GraphEdge edge37 = new GraphEdge(nodes.get(3), nodes.get(7));GraphEdge edge47 = new GraphEdge(nodes.get(4), nodes.get(7));GraphEdge edge56 = new GraphEdge(nodes.get(5), nodes.get(6));nodes.get(0).addEdgeList(edge01);nodes.get(0).addEdgeList(edge02);nodes.get(1).addEdgeList(edge13);nodes.get(1).addEdgeList(edge14);nodes.get(2).addEdgeList(edge25);nodes.get(2).addEdgeList(edge26);nodes.get(3).addEdgeList(edge37);nodes.get(4).addEdgeList(edge47);nodes.get(5).addEdgeList(edge56);}public void initGraph() {initGraph(8, false);}public List<GraphNode> getGraphNodes() {return nodes;} } ?
有了圖的結(jié)構(gòu),我們就可以進(jìn)行一些實際的操作了。

深度優(yōu)先搜索:

?

public class DFSearch {/*** 深度遍歷* DFSearch* @param node* 當(dāng)前節(jié)點(diǎn)* @param visited* 被訪問過的節(jié)點(diǎn)列表*/public void searchTraversing(GraphNode node, List<GraphNode> visited) {// 判斷是否遍歷過if (visited.contains(node)) {return;}visited.add(node);System.out.println("節(jié)點(diǎn):" + node.getLabel());for (int i = 0; i < node.edgeList.size(); i++) {searchTraversing(node.edgeList.get(i).getNodeRight(), visited);}} } ?

廣度優(yōu)先搜索:

?

public class BFSearch {/*** 廣度優(yōu)先搜索* BFSearch* @param node* 搜索的入口節(jié)點(diǎn)*/public void searchTraversing(GraphNode node) {List<GraphNode> visited = new ArrayList<GraphNode>(); // 已經(jīng)被訪問過的元素Queue<GraphNode> q = new LinkedList<GraphNode>(); // 用隊列存放依次要遍歷的元素q.offer(node);while (!q.isEmpty()) {GraphNode currNode = q.poll();if (!visited.contains(currNode)) {visited.add(currNode);System.out.println("節(jié)點(diǎn):" + currNode.getLabel());for (int i = 0; i < currNode.edgeList.size(); i++) {q.offer(currNode.edgeList.get(i).getNodeRight());}}}} }

?

運(yùn)行結(jié)果:



源碼下載:

http://download.csdn.net/detail/u013761665/8968443

總結(jié)

以上是生活随笔為你收集整理的Java实现图的深度和广度优先遍历算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。