图的广度优先搜素
来源:互联网 发布: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();
}
}
- 图的广度优先搜素
- 图的广度优先
- 广度优先搜素
- javascript实现图的广度优先搜索、深度优先搜素
- 图的深度优先,广度优先
- 图的遍历-(深度优先&广度优先)
- 图的深度优先和广度优先
- 图的遍历:深度优先、广度优先
- 图的广度优先遍历
- 图的广度优先遍历
- 图的广度优先搜索
- 图的广度优先搜索
- 图的广度优先遍历
- 图的广度优先搜索
- 图的广度优先搜索
- 图的广度优先搜索
- 图的广度优先搜索
- 图的广度优先搜索
- C6的工程转换为VS2008的工程后,编译找不到而且不能升级vc90.pdb文件的问题解决方法
- VC++ Tab Control控件的基本用法
- 常用網址
- JavaScript的Table表格对象
- vb下的with语句定义BITMAPINFO类型的变量
- 图的广度优先搜素
- JAVA中替换一些特殊字符的方法
- boost 序列化成 xml文件
- S3C2410中的脉宽调制定时器(PWM)
- JSBL_事件及DOM操作
- maven2 依赖包的复制
- GridView各个事件中,怎样获取主键值
- FCLK PCLK HCLK
- AJAX中同时发送多个请求XMLHttpRequest对象处理方法