圖的深度優先遍歷以及廣度優先遍歷
import java.util.ArrayList;
import java.util.LinkedList;
/**
* @description 鄰接矩陣模型類
* @author beanlam
* @time 2015.4.17
*/
public class AMWGraph {
private ArrayList vertexList;//儲存點的連結串列
private int[][] edges;//鄰接矩陣,用來儲存邊
private int numOfEdges;//邊的數目
public AMWGraph(int n) {
//初始化矩陣,一維陣列,和邊的數目
edges=new int[n][n];
vertexList=new ArrayList(n);
numOfEdges=0;
}
//得到結點的個數
public int getNumOfVertex() {
return vertexList.size();
}
//得到邊的數目
public int getNumOfEdges() {
return numOfEdges;
}
//返回結點i的資料
public Object getValueByIndex (int i) {
return vertexList.get(i);
}
//返回v1,v2的權值
public int getWeight(int v1,int v2) {
return edges[v1][v2];
}
//插入結點
public void insertVertex(Object vertex) {
vertexList.add(vertexList.size(),vertex);
}
//插入結點
public void insertEdge(int v1,int v2,int weight) {
edges[v1][v2]=weight;
numOfEdges++;
}
//刪除結點
public void deleteEdge(int v1,int v2) {
edges[v1][v2]=0;
numOfEdges--;
}
//得到第一個鄰接結點的下標
public int getFirstNeighbor(int index) {
for(int j=0;j<vertexList.size();j++) {
if (edges[index][j]>0) {
return j;
}
}
return -1;
}
//根據前一個鄰接結點的下標來取得下一個鄰接結點
public int getNextNeighbor(int v1,int v2) {
for (int j=v2+1;j<vertexList.size();j++) {
if (edges[v1][j]>0) {
return j;
}
}
return -1;
}
//私有函式,深度優先遍歷
private void depthFirstSearch(boolean[] isVisited,int i) {
//首先訪問該結點,在控制檯打印出來
System.out.print(getValueByIndex(i)+" ");
//置該結點為已訪問
isVisited[i]=true;
int w=getFirstNeighbor(i);//
while (w!=-1) {
if (!isVisited[w]) {
depthFirstSearch(isVisited,w);
}
w=getNextNeighbor(i, w);
}
}
//對外公開函式,深度優先遍歷,與其同名私有函式屬於方法過載
public void depthFirstSearch() {
for(int i=0;i<getNumOfVertex();i++) {
//因為對於非連通圖來說,並不是通過一個結點就一定可以遍歷所有結點的。
if (!isVisited[i]) {
depthFirstSearch(isVisited,i);
}
}
}
//私有函式,廣度優先遍歷
private void broadFirstSearch(boolean[] isVisited,int i) {
int u,w;
LinkedList queue=new LinkedList();
//訪問結點i
System.out.print(getValueByIndex(i)+" ");
isVisited[i]=true;
//結點入佇列
queue.addlast(i);
while (!queue.isEmpty()) {
u=((Integer)queue.removeFirst()).intValue();
w=getFirstNeighbor(u);
while(w!=-1) {
if(!isVisited[w]) {
//訪問該結點
System.out.print(getValueByIndex(w)+" ");
//標記已被訪問
isVisited[w]=true;
//入佇列
queue.addLast(w);
}
//尋找下一個鄰接結點
w=getNextNeighbor(u, w);
}
}
}
//對外公開函式,廣度優先遍歷
public void broadFirstSearch() {
for(int i=0;i<getNumOfVertex();i++) {
if(!isVisited[i]) {
broadFirstSearch(isVisited, i);
}
}
}
}
相關推薦
圖的深度優先遍歷以及廣度優先遍歷
import java.util.ArrayList; import java.util.LinkedList; /** * @description 鄰接矩陣模型類 * @author beanlam * @time 2015.4.17 */ public cl
java中樹的遍歷,包括先序遍歷、中序遍歷、後序遍歷以及廣度優先遍歷跟深度優先遍歷
先總結一下各種遍歷方式的區別 前序遍歷:根結點 ---> 左子樹 ---> 右子樹 中序遍歷:左子樹---> 根結點 ---> 右子樹 後序遍歷:左子樹 ---> 右子樹 ---> 根結點 廣度優先,從左到右 深度
鄰接表的深度優先遍歷以及廣度優先遍歷
#include <stdio.h> #include <stdlib.h> #define MAX 20 int visited[20]; typedef struct ArcNode{ int adjvex; struct ArcNode
二叉樹的深度優先遍歷以及廣度優先遍歷實現
深度遍歷分為先序遍歷,中序遍歷,以及後序遍歷;而深度遍歷的方式又分為遞迴深度遍歷和棧深度遍歷。 廣度優先遍歷是層序遍歷: #!/usr/bin/env python #coding:utf-8 class TreeNode(object): def
圖的基本概念表示方法以及兩種搜尋方式——深度優先遍歷和廣度優先遍歷
原先的知識沒好好學,導致現在很多都忘了,或者說以前就沒弄懂過。現在重新看一遍,收穫良多,不管怎樣先寫這篇基礎的,當做筆記。 圖的定義:是由頂點的有窮非空集合和頂點之間的邊的集合組成的,通常表示為 G(V,E)。其中G表示一個圖,V是圖的頂點的集合,E是圖的邊的集合。 有跟多
【圖的遍歷】廣度優先遍歷(DFS)、深度優先遍歷(BFS)及其應用
bsp 及其 spa (第五版 family 實驗 條件 soft 深度優先遍歷算法 無向圖滿足約束條件的路徑 • 目的:掌握深度優先遍歷算法在求解圖路徑搜索問題的應用 內容:編寫一個程序,設計相關算法,從無向圖G中找出滿足如下條件的所有路徑 (1)給定
圖的遍歷之 深度優先搜索和廣度優先搜索
順序 如果 一個 depth cde ava nbsp github 深度優先搜索遍歷 本章會先對圖的深度優先搜索和廣度優先搜索進行介紹,然後再給出C/C++/Java的實現。 目錄 1. 深度優先搜索的圖文介紹 1.1 深度優先搜索介紹 1.2 深度優先搜索圖解
演算法----圖的遍歷(深度優先搜尋DFS、廣度優先搜尋BFS)
圖的遍歷的定義:從圖的某個頂點出發訪問圖中所有的點,且每個頂點僅被訪問一次。 深度優先搜尋DFS: 準備:指定的起始點和終點,確定好當前點與鄰接點之間的偏移值、結束搜尋的條件、符合訪問的點所需條件、回溯處理; (1)若當前點的鄰接點有未被訪問的,則選一個進行訪問; (2)若當前點的鄰接點都不符合訪問條
圖的遍歷(深度優先遍歷和廣度優先遍歷)
圖的遍歷就是從圖中某個頂點出發,按某種方法對圖中所有頂點訪問且僅訪問一次。 圖的遍歷演算法是求解圖的連通性問題、拓撲排序和求關鍵路徑等演算法的基礎 深度優先遍歷(depth-first search):類似於樹的先根遍歷,是樹的先根遍歷的推廣 (可以採用遞迴和藉助棧的非遞迴方式實現)
Java資料結構:圖的深度優先遍歷和廣度優先遍歷
更新啦,更新啦。 圖的深度優先遍歷:通過一個結點開始遍歷,直到遍歷到該結點沒有下一個結點為止,然後開始遞迴下一個結點,如果被訪問過,則跳過遍歷,依次類推。類似於一口氣到底,如果沒到底,則換個結點繼續到底。如果被訪問過的結點則不需要遍歷。 過程:A開始進入遞迴,A先列印。然後發現A的下一
圖的深度優先遍歷和廣度優先遍歷
1.深度優先遍歷(DFS) (1)從某個頂點V出發,訪問頂點並標記為已訪問 (2)訪問V的鄰接點,如果沒有訪問過,訪問該頂點並標記為已訪問,然後再訪問該頂點的鄰接點,遞迴執行 如果該頂點已訪問過,退回上一個頂點,再檢查該頂點的鄰接點是否都被訪問過,如果有沒有訪
資料結構--C語言--圖的深度優先遍歷,廣度優先遍歷,拓撲排序,用prime演算法實現最小生成樹,用迪傑斯特拉演算法實現關鍵路徑和關鍵活動的求解,最短路徑
實驗七 圖的深度優先遍歷(選做,驗證性實驗,4學時) 實驗目的 熟悉圖的陣列表示法和鄰接表儲存結構,掌握構造有向圖、無向圖的演算法 ,在掌握以上知識的基礎上,熟悉圖的深度優先遍歷演算法,並實現。 實驗內容 (1)圖的陣列表示法定義及
圖:深度優先遍歷和廣度優先遍歷(Java實現)
深度優先遍歷 深度優先遍歷,從初始訪問結點出發,我們知道初始訪問結點可能有多個鄰接結點,深度優先遍歷的策略就是首先訪問第一個鄰接結點,然後再以這個被訪問的鄰接結點作為初始結點,訪問它的第一個鄰接結點。總結起來可以這樣說:每次都在訪問完當前結點後首先訪問當前結點的
鄰接矩陣的深度以及廣度優先遍歷
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<queue> #define INF 0x3f3f3f3f using nam
C語言實現圖的鄰接矩陣儲存結構及深度優先遍歷和廣度優先遍歷
DFS的核心思想在於對訪問的鄰接節點進行遞迴呼叫;BFS的核心思想在於建立了一個鄰接節點的佇列。 在Dev C++中除錯執行通過。 用下圖進行了測試。 #include <stdio.h> #define MaxVertexNum 50 #defin
Java實現圖的深度優先遍歷和廣度優先遍歷
private int vertexSize;//頂點數量 public int getVertexSize() { return vertexSize; } public void setVertexSize(int vertexSize)
建立有向圖的鄰接表,深度優先遍歷和廣度優先遍歷的遞迴與非遞迴演算法,判斷是否是有向無環圖,並輸出一種拓撲序列
/*(1)輸入一組頂點,建立有向圖的鄰接表,進行DFS(深度優先遍歷)和BFS(廣度優先遍歷)。 寫出深度優先遍歷的遞迴和非遞迴演算法。 (2)根據建立的有向圖,判斷該圖是否是有向無環圖,若是,則輸出其一種拓撲有序序列。*/ #include<stdio.h>
資料結構之圖的深度優先遍歷和廣度優先遍歷
1.圖的簡單介紹 上圖就是一個圖(無線圖),由頂點和連線組成 圖可以分為無向圖和有向圖(這個又有出度、入度的概念)、網,一般來說圖有兩種常用的表示方式,鄰接矩陣(用二維陣列的形式表示)和鄰接表(主要是陣列+連結串列的形式表示),圖常用的遍歷方式有深度優先遍歷(DFS)和廣
資料結構---圖的鄰接表(建立、列印、深度優先遍歷,廣度優先遍歷C語言)
當一個圖為稀疏圖時,使用鄰接矩陣會浪費大量儲存空間。 鄰接表法結合了順序儲存和鏈式儲存方法,減少了不必要的浪費。 鄰接表 1)對圖G的每個頂點vi建立一個單鏈表,第i個單鏈表中的結點表示依附於頂點vi的邊(對於有向圖則是以頂點vi為尾的弧)。這個單鏈表就稱為頂點vi
C++實現圖的鄰接矩陣的建立以及其深度優先遍歷和廣度優先遍歷
#include<iostream> using namespace std; typedef char vertextype; typedef int edgetype; #define maxvex 100 #define infinity 1000 #in