BFS & dijstra

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);
	
	}
	
}