package structure.graph.traverse;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Random;
import structure.graph.create.GraphCreater_01;
import structure.graph.node.GNode_01;
/**
* 图的广度优先遍历
* @author Toy
*/
public class BFS_01 {
/**
* g为图的邻接矩阵,list为顶点元素,isDirect表示是否为有向图
* @param g
* @param list
* @param isDirect
*/
public void bfs_01(int[][] g,ArrayList<GNode_01> list,boolean isDirect){
int size=list.size();
HashSet<GNode_01> visited=new HashSet<GNode_01>();
LinkedList<GNode_01> queue=new LinkedList<GNode_01>();
int si=new Random().nextInt(size);
queue.offer(list.get(si));
while(!queue.isEmpty()){
GNode_01 curr = queue.removeFirst();
if(visited.contains(curr)){
// System.out.println("has visit");
continue;
}
curr.show();
visited.add(curr);
int idx=getNodeIndex(curr,list);
if(idx>=0){
for(int i=0;i<size;i++){
if(g[idx][i]>0&&!visited.contains(list.get(i))){
queue.offer(list.get(i));
}
}
}
}
}
/**
* 在list获取节点n的索引位置
* @param n
* @param list
* @return
*/
private int getNodeIndex(GNode_01 n, ArrayList<GNode_01> list) {
String label=n.getLabel();
for(int i=0;i<list.size();i++){
if(label.equals(list.get(i).getLabel())){
return i;
}
}
return -1;
}
/**
* @param args
*/
public static void main(String[] args) {
boolean isDirect=false;
GraphCreater_01 c=new GraphCreater_01();
int[][] g = c.createGraph(isDirect);
c.show(g, c.vertexList.size());
BFS_01 t=new BFS_01();
t.bfs_01(g, c.vertexList, isDirect);
}
}
图的广度优先遍历
最新推荐文章于 2024-03-13 15:38:05 发布