图的广度优先搜素

来源:互联网 发布:phpstudy切换php版本 编辑:程序博客网 时间:2024/05/16 01:39

 package 图;
/*
图的广度优先搜索,运用队列,有三个规则
1.访问下一个未来访问的邻接点(如果存在),这个顶点必须是当前顶点的邻节点,标记他(用wasVisited标记),并且放入队列中
2.如果因为已经没有未访问顶点而不能执行1,则从队列头取一个顶点(如果存在),并使其成为当前顶点
3.如果因为队列为空而不能执行规则2,则搜索结束
 */
 
 
class Queue
{
   private final int SIZE=20;
   private int[] array;
   private int front;
   private int rear;
   public Queue()
   {
    array=new int[SIZE];
    front=0;
    rear=-1;
   }
   public void insert(int j)
   {
    if(rear==SIZE-1)
     rear=-1;
    array[++rear]=j;
   }
   public int remove()
   {
    int temp=array[front++];
    if(front==SIZE)
     front=0;
    return temp;
   }
   public boolean isEmpty()
   {
    return(rear+1==front||(front+SIZE-1==rear));
   }
  
}
//此类的作用是顶点的内容和是否被访问的标记
class Vertex1
{
   public char label;
   public boolean wasVisited;
   public Vertex1(char c)
   {
    label=c;
    wasVisited=false;
   }
}
class Graph
{
 
 private Vertex1[] VArray;
 private int nElems;
    private int[][] bjsMat;
    private final int MAX_SIZE=20;
    Queue queue;
    public Graph()
    {
        VArray=new Vertex1[MAX_SIZE];
        nElems=0;
        bjsMat=new int[MAX_SIZE][MAX_SIZE];
        for(int i=0;i<MAX_SIZE;i++)
         for(int j=0;j<MAX_SIZE;j++)
          bjsMat[i][j]=0;
        queue=new Queue();
       
    }
    public void addVertex(char lab)
    {
        VArray[nElems++]=new Vertex1(lab); 
    }
    public void addEdge(int start,int end)
    {
     bjsMat[start][end]=1;
     bjsMat[end][start]=1;
    }
    public void display(int key)
    {
     System.out.print("char: "+VArray[key].label+" ");
    }
    //经典算法
    public void bjs()
    {
     VArray[0].wasVisited=true;
     display(0);
     queue.insert(0);
     int v2;
     while(!queue.isEmpty())
     {
      int v1=queue.remove();
      //输出与v1直接相连的元素
      while((v2=getAdjUnvisitedVertex(v1))!=-1)
      {
       VArray[v2].wasVisited=true;
       display(v2);
       queue.insert(v2);
      }
     }
     for(int i=0;i<nElems;i++)
      VArray[i].wasVisited=false;
    }
    public int getAdjUnvisitedVertex(int key)
    {
     for(int j=0;j<nElems;j++)
     {
      //System.out.print("paidu: "+VArray[j].wasVisited+" ");
      if(bjsMat[key][j]==1&&VArray[j].wasVisited==false)
       return j;
      
       
     }
     return -1;
    }
    public void play()
    {
     for(int i=0;i<nElems;i++)
     System.out.print("zifu "+VArray[i].label+" ");
    }
}

public class bfs
{
 public static void main(String[] args)
 {
  Graph graph=new Graph();
  for(int i=0;i<5;i++)
  {
   char c=(char) (java.lang.Math.random ()*26+'a');
   graph.addVertex(c);
  }
  graph.addEdge(0, 1);
  graph.addEdge(1, 2);
  graph.addEdge(0, 3);
  graph.addEdge(3, 4);
  graph.play();
  System.out.println();
  System.out.println("Visit: ");
  graph.bjs();
  System.out.println();
  
  
 }
}