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);
}
}
}
}
圖的深度優先遍歷以及廣度優先遍歷
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.