https://blog.csdn.net/carson0408/article/details/78634650#commentBox 不錯的博客
廣度優先搜索:
package zhang01; import java.util.LinkedList; import java.util.Queue; public class BFSfisrt { private Queue<Integer> queue; private Queue<Integer> visited; public BFSfisrt() { queue=new LinkedList<Integer>(); visited=new LinkedList<Integer>(); } public int getIndex(char v,char[] str) { //找到元素所在位置 用於在矩陣中找到相應的行 從而找到相關連的元素 for (int j = 0; j < str.length; j++) { if (v==str[j]) { return j; } } return -1; } //1.a將切入點加入隊列 b加入已訪問隊列 c輸出切入點 //2.當q隊列不爲空時 刪除隊頭 並依次與隊頭元素相連的元素 加入Q隊列 和 visited隊列 public void bfs(int[][] matrix,char v,char[] str ) { // str待搜索的圖中元素 matrix是點相連的鄰接矩陣 v切入點 int index=getIndex(v, str); queue.add(index); //a visited.add(index); //b System.out.print(str[index]+" "); //c while (!queue.isEmpty()) { int colIndex=queue.remove(); //加入即代表 相連就代表輸出的順序 for (int i = 0; i < str.length; i++) { //刪除隊頭 把關聯元素 依次加入隊 加入已訪問 打印 if (matrix[colIndex][i]==1&&!(visited.contains(i))) { queue.add(i); visited.add(i); System.out.print(str[i]+" "); } } } } public static void main(String[] args) { char[] str= {'A','B','C','D','E','F','G','H'}; int[][] matrix= { {0,1,1,0,0,0,0,0}, {1,0,0,1,1,0,0,0}, {1,0,0,0,0,1,1,0}, {0,1,0,0,0,0,0,1}, {0,1,0,0,0,0,0,1}, {0,0,1,0,0,0,0,0}, {0,0,1,0,0,0,0,0}, {0,0,0,1,1,0,0,0}}; BFSfisrt bfSfisrt=new BFSfisrt(); bfSfisrt.bfs(matrix, 'B', str); } }
djikstra:
需要:1.隊列Visited 記錄已經找到最短路徑的 2.數組 distence[] 用於記錄源點到各個節點的距離 3.hashmap path用於記錄路徑
步驟:1.創建上述需要的對象
2.
package zhang01; import java.util.HashMap; import java.util.LinkedList; import java.util.PriorityQueue; import java.util.Queue; public class Dijkstra { private Queue visited; //已經找到最短路徑的頂點的隊列visited int[] distance; //數組distance來保存源點到各個頂點的最短距離 HashMap path; public Dijkstra(int len) { visited=new LinkedList(); distance=new int[len]; } public int getIndex(Queue visited,int[] distance) { //返回 不在已訪問最短路徑隊列 且 distence最小 的下標 int k=-1; //待返回下標 int min_num=Integer.MAX_VALUE; //由於尋找最小值 for (int j = 0; j < distance.length; j++) { if(!visited.contains(j)) { //if 而不是while if (min_num>distance[j]) { min_num=distance[j]; k=j; } } } return k; } public void dijkstra(int[][] matrix,Object[] str,int v) { path=new HashMap(); //初始化 for (int i = 0; i < str.length; i++) { path.put(i, str[v]); //初始化每條路徑的源點 if (v==i) { //初始化源點 到 節點距離及到各節點的路徑 distance[i]=0; }else if (matrix[v][i]!=-1) { distance[i]=matrix[v][i]; path.put(i, path.get(i)+"-->"+str[i]); //path.get(i) 是初始化時的源點 str[i] 是第i個字符元素 }else { distance[i]=Integer.MAX_VALUE; } } visited.add(v); //此時初始化完畢 //找到每一層中 路徑權重最小值的路徑 //判斷其他幾個路徑 如果最小路徑 新加爲其他幾個節點爲末節點 是否會使其他路徑的總權重變小 //如果有其他路徑比原來總權重變小 則用現最小路徑+改路的末節點 構成新路 while (visited.size()<str.length) { //結束條件是 最短路徑的頂點的隊列visited 包含所有元素 int k=getIndex(visited, distance); visited.add(k); //!!!!注意是在這加入的 找到最小路徑時加入 if (k!=-1) { //判斷一下在進行下面 不然會報下標越界 for (int i = 0; i < str.length; i++) { if (matrix[k][i]!=-1) { //判斷k能直接到達的點 if (distance[i]>distance[k]+matrix[k][i]) { distance[i]=distance[k]+matrix[k][i]; //注意 path.put(i, path.get(k)+"-->"+str[i]); //一定注意 是get(k) 而不是get(i) 獲取當前的最小路徑 } } } } } for (int i = 0; i < str.length; i++) { System.out.print(str[v]+"-->"+str[i]+":"+distance[i]+" "); if (distance[i]==Integer.MAX_VALUE) System.out.print(str[v]+"-->"+str[i]+"之間沒有最短路徑"); else { System.out.print(str[v]+"-->"+str[i]+"之間的最短路徑爲:"+path.get(i)); } System.out.println(); } } public static void main(String[] args) { // TODO Auto-generated method stub int[][] weight= { {0,-1,10,-1,30,100}, //0 {-1,0,5,-1,-1,-1}, //1 {-1,-1,0,50,-1,-1}, //2 {-1,-1,-1,0,-1,10}, //3 {-1,-1,-1,20,0,60}, //4 {-1,-1,-1,-1,-1,0}}; String[] str= {"V1","V2","V3","V4","V5","V6"}; int len=str.length; Dijkstra dijkstra=new Dijkstra(len); dijkstra.dijkstra(weight, str, 0); } }