BFS最短路路径

package com.example.chantest;


import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Queue;
import java.util.Stack;


public class FindPath {

public interface Algorithm {
//执行算法


void perform(Graph g, String sourceVertex);


//得到路径
Map<String,String> getPath();
}



public static class Graph {
 // 图的起点
 private String firstVertax;
 // 邻接表
 private Map<String, List<String>> adj = new HashMap<>();
 // 遍历算法
 //private Algorithm algorithm;
 private BroadFristSearchAlgorithm algorithm;
 public Graph(BroadFristSearchAlgorithm bb) {
 algorithm = bb;
 }
 /**
  * 执行算法
  */
 public void done() {
 algorithm.perform(this, firstVertax);
 }
 /**
  * 得到从起点到{@code vertex}点的最短路径
  * @param vertex
  * @return
  */
 public Stack<String> findPathTo(String vertex) {
   Stack<String> stack = new Stack<>();//stack栈,后入先出
   stack.add(vertex);
   Map<String, String> path = algorithm.getPath();
   for (String location = path.get(vertex) ; false == location.equals(firstVertax) ; location = path.get(location)) {
     stack.push(location);//把项压入栈顶部
   }
   stack.push(firstVertax);
   return stack;
 }
 /**
  * 添加一条边
  */
 public void addEdge(String fromVertex, String toVertex) {
   if (firstVertax == null) {
     firstVertax = fromVertex;
   }
   adj.get(fromVertex).add(toVertex);
   adj.get(toVertex).add(fromVertex);
 }
 /**
  * 添加一个顶点
  */
 public void addVertex(String vertex) {
   adj.put(vertex, new ArrayList<>());
 }
 public Map<String, List<String>> getAdj() {
   return adj;
 }
}

/**
* 封装BFS算法
*/
public static class BroadFristSearchAlgorithm implements Algorithm {
 // 保存已经访问过的地点
 private List<String> visitedVertex;
 // 保存最短路径
 private Map<String, String> path;
 @Override
 public void perform(Graph g, String sourceVertex) {
   if (null == visitedVertex) {
     visitedVertex = new ArrayList<>();
   }
   if (null == path) {
     path = new HashMap<String, String>();
   }
   BFS(g, sourceVertex);
   System.out.println("\n"+"........");
   visitedVertex.clear();//清空集合中被标记的节点
   //DFS(g,sourceVertex);
 }
 @Override
 public Map<String,String> getPath() {
   return path;
 }
 private void BFS(Graph g, String sourceVertex) {
   Queue<String> queue = new LinkedList<>();//队列,先进先出
   // 标记起点
   visitedVertex.add(sourceVertex);
   // 起点入列
   queue.add(sourceVertex);
   while (false == queue.isEmpty()) {
     String ver = queue.poll();//遍历起始点
     List<String> toBeVisitedVertex = g.getAdj().get(ver);//起始点下的点
     for (String v : toBeVisitedVertex) {
       if (false == visitedVertex.contains(v)) {
         visitedVertex.add(v);
         //打印当前节点
         System.out.print(v+" ");
         path.put(v, ver);
         queue.add(v);
       }
     }
   }
 }
 
 private void DFS(Graph g,String firstVertex){
 if(visitedVertex.contains(firstVertex)){
 return;
 }
 visitedVertex.add(firstVertex);
 //打印当前节点
 System.out.print(firstVertex+" ");
 for(int i=0;i<g.getAdj().get(firstVertex).size();i++){
 DFS(g,g.getAdj().get(firstVertex).get(i));
 }
 }

}

public static void main(String[] args){
final String[] str={"NorthGate","ClassRoom","lalala","Square","Toilet","Canteen","South Gate"};
//final String[] str = new String[16];
Graph g = new Graph(new BroadFristSearchAlgorithm());
for(int i=0;i<7;i++){
//str[i]=String.valueOf(i);
g.addVertex(str[i]);
}
 

g.addEdge(str[0], str[1]);
g.addEdge(str[0], str[2]);
g.addEdge(str[0], str[3]);
g.addEdge(str[1], str[4]);
g.addEdge(str[2], str[4]);
//g.addEdge(str[2], str[5]);
g.addEdge(str[3], str[5]);
g.addEdge(str[4], str[6]);
g.addEdge(str[5], str[6]);
 
/*
g.addEdge(str[0], str[1]);
g.addEdge(str[0], str[4]);
g.addEdge(str[1], str[2]);
g.addEdge(str[1], str[5]);
g.addEdge(str[2], str[3]);
g.addEdge(str[2], str[6]);
//g.addEdge(str[3], str[7]);
g.addEdge(str[4], str[5]);
g.addEdge(str[4], str[8]);
//g.addEdge(str[5], str[6]);
g.addEdge(str[5], str[9]);
g.addEdge(str[6], str[7]);
g.addEdge(str[6], str[10]);
//g.addEdge(str[7], str[11]);
g.addEdge(str[8], str[9]);
g.addEdge(str[8], str[12]);
g.addEdge(str[9], str[10]);
g.addEdge(str[9], str[13]);
g.addEdge(str[10], str[11]);
g.addEdge(str[10], str[14]);
//g.addEdge(str[11], str[15]);
g.addEdge(str[12], str[13]);
g.addEdge(str[13], str[14]);
g.addEdge(str[14], str[15]);
*/
g.done();
Stack<String> result = g.findPathTo(str[5]);
System.out.println("BFS: From [North Gate] to [Canteen]:");
 
while (!result.isEmpty()) {
     System.out.println(result.pop());
   }
}



}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值