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