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