圖的廣度優先搜素

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章