AMatrix、AMatrixTest、CrossList、CrossListTest、Road、RoadTestjava
實驗目的:用鄰接矩陣實現無向圖(邊和頂點都要保存),實如今包含添加和刪除結點的方法,添加和刪除邊的方法,size(),isEmpty(),廣度優先迭代器,深度優先迭代器git
肯定圖的頂點個數和邊的個數; 輸入頂點信息存儲在一維數組vertex中; 初始化鄰接矩陣; 依次輸入每條邊存儲在鄰接矩陣中; 輸入邊依附的兩個頂點的序號i, j; 將鄰接矩陣的第i行第j列的元素值置爲1; 將鄰接矩陣的第j行第i列的元素值置爲1;
size()
和isEmpty()
的方法,返回二維數組的大小和斷定二維數組是否爲空。public void addVertex(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 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 broadFirstSearch(boolean[] isVisited, int i) { int a, b; LinkedList queue = new LinkedList(); System.out.print(getValueByIndex(i) + " "); isVisited[i] = true; queue.addLast(i); while (!queue.isEmpty()) { a = ((Integer) queue.removeFirst()).intValue(); b = getFirstNeighbor(a); while (b != -1) { if (!isVisited[b]) { System.out.print(getValueByIndex(b) + " "); isVisited[b] = true; queue.addLast(b); } b = getNextNeighbor(a, b); } } } public void broadFirstSearch() { for(int i = 0; i< size(); i++) { if(!isVisited[i]) { broadFirstSearch(isVisited, i); } } }
public 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< size(); i++) { if (!isVisited[i]) { depthFirstSearch(isVisited,i); } } }
實驗目的:用十字鏈表實現無向圖(邊和頂點都要保存),實如今包含添加和刪除結點的方法,添加和刪除邊的方法,size(),isEmpty(),廣度優先迭代器,深度優先迭代器算法
public static class Vertex<E,T> { E data; Edge<T> firstIn; Edge<T> firstOut; public Vertex(E data) { this.data = data; } } public static class Edge<E> { E data; int From; int To; Edge<E> SameFromVertex; Edge<E> SameToVertex; public Edge(E data, int From, int To) { this.data = data; this.From = From; this.To = To; } }
public void removeV(Vertex<Integer, Integer> vex){ for (int index = 0; index< AllEdge.size(); index++){ if (AllEdge.get(index).From== AllVertex.indexOf(vex)|| AllEdge.get(index).To== AllVertex.indexOf(vex)){ AllEdge.remove(index); index=0; } } AllVertex.remove(vex); } public void addE(Edge<Integer> edge) { Edge<Integer> edge1 = new Edge<>(edge.data,edge.From,edge.To); Edge<Integer> edge2 = new Edge<>(edge.data,edge.From,edge.To); AllEdge.add(edge); int fromVertexIndex = edge.From; int toVertexIndex = edge.To; Vertex<Integer, Integer> fromVertex = AllVertex.get(fromVertexIndex); Vertex<Integer, Integer> toVertex = AllVertex.get(toVertexIndex); if (fromVertex.firstOut == null) { fromVertex.firstOut = edge1; } else { Edge<Integer> tempEdge = fromVertex.firstOut; while (tempEdge.SameFromVertex != null) { tempEdge = tempEdge.SameFromVertex; System.out.println(); } tempEdge.SameFromVertex = edge1; } if (toVertex.firstIn == null) { toVertex.firstIn = edge2; } else { Edge<Integer> tempEdge = toVertex.firstIn; while (tempEdge.SameToVertex != null) { tempEdge = tempEdge.SameToVertex; } tempEdge.SameToVertex = edge2; } System.out.println(); }
size()
方法須要將添加的結點保存至一個集合,不然沒法獲得返回值。static List<Vertex<Integer,Integer>> AllVertex = new ArrayList<>(); public int size(){ return AllVertex.size(); }
實驗目的:建立計算機網絡路由系統,輸入網絡中點到點的線路,以及每條線路使用的費用,系統輸出網絡中各點之間最便宜的路徑,指出不相通的全部位置。數組
public Road(boolean graphType, boolean method, int size) { this.graphType = graphType; this.method = method; this.NumVertex = 0; this.matrix = size; if (this.method) { visited = new boolean[matrix]; vertexesArr = new Object[matrix]; edgesMatrix = new int[matrix][matrix]; for (int row = 0; row < edgesMatrix.length; row++) { for (int column = 0; column < edgesMatrix.length; column++) { edgesMatrix[row][column] = MAX_VALUE; System.out.print(""); } } } }
public void Dijkstra(int v0) { int[] dist = new int[matrix]; int[] prev = new int[matrix]; for (int i = 0; i < NumVertex; i++) { dist[i] = edgesMatrix[v0][i]; visited[i] = false; if (i != v0 && dist[i] < MAX_VALUE) prev[i] = v0; else prev[i] = -1; } visited[v0] = true; int minDist; int v = 0; for (int i = 1; i < NumVertex; i++) { minDist = MAX_VALUE; for (int j = 0; j < NumVertex; j++) { if ((!visited[j]) && dist[j] < minDist) { v = j; minDist = dist[j]; } } visited[v] = true; for (int j = 0; j < NumVertex; j++) { if ((!visited[j]) && edgesMatrix[v][j] < MAX_VALUE) { if (minDist + edgesMatrix[v][j] <= dist[j]) { dist[j] = minDist + edgesMatrix[v][j]; prev[j] = v; } } } } for (int i = 0; i < matrix; i++) { if (dist[i] > 1000) { dist[i] = 0; } System.out.println(vertexesArr[v0] + "到" + vertexesArr[i] + "的最短路徑是:" + dist[i]); } }
public void DRoad(int v0) { Queue<Integer> queue = new LinkedList<Integer>(); for (int i = 0; i < NumVertex; i++) { visited[i] = false; } for (int i = 0; i < NumVertex; i++) { if (!visited[i]) { queue.add(i); visited[i] = true; while (!queue.isEmpty()) { int row = queue.remove(); System.out.print(vertexesArr[row] + "→"); for (int k = getMin(row); k >= 0; k = getMin(row)) { if (!visited[k]) { queue.add(k); visited[k] = true; } } } } } }