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