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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值