邻接表实现:
使用vector数组存储节点,每个vector[i]表示当前节点i,里面存储连接到的节点
用队列linkedList做广度优先遍历,用LinkedHashSet做访问数组visited,记录访问过的节点并加入未访问的新节点
如果Set的大小等于节点数,说明访问完全部节点,退出
输入
5
2 3 3 4 4 5 5 3 2 1
输出:
2
3
1
4
5
package Graph;
import java.util.*;
public class BreadthFirstSearch {
public static void main(String []args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()) {
int n=Integer.parseInt(sc.nextLine());//输入顶点数目
//输入有向图,如2 3 3 4,表示两个边:2->3,3->4
String line=sc.nextLine();
Set<Integer> visited=(new BreadthFirstSearch()).bfs(n,line);
//顺序打印访问的节点
for(int v:visited) {
System.out.println(v);
}
}
}
private Set<Integer> bfs(int n,String line){
String []edge=line.split(" ");
//邻接表法存储图
Vector<Integer> []g=new Vector[n+1];//下标从1开始
for(int i=0;i<g.length;i++) {
g[i]=new Vector<Integer>();
}
for(int i=0;i<edge.length;i=i+2) {
int begin=Integer.parseInt(edge[i]);
int end=Integer.parseInt(edge[i+1]);
//System.out.println(i+":"+begin+":"+end);
g[begin].add(end);
}
Set<Integer> visited=new LinkedHashSet<>();
Queue<Integer> que=new LinkedList<>();
que.offer(Integer.parseInt(edge[0]));//从第一个节点开始遍历
while(!que.isEmpty()) {
int v=que.poll();
visited.add(v);
for(int i=0;i<g[v].size();i++) {
if(!visited.contains(g[v].get(i))) {
que.offer(g[v].get(i));
visited.add(g[v].get(i));
}
}
if(visited.size()==g.length-1) {//已经遍历完所有节点
break;
}
}
return visited;
}
}