您的位置:首页 > 编程语言 > Java开发

邻接表实现图的广搜和深搜(java模板)

2013-02-24 19:04 288 查看
//邻接表实现图的广搜和深搜(java模板)

Java代码







import java.util.*;

public class GraphSearch{

private int n; //图的顶点数,顶点为0,1,2,,,,n-1

private List<ArrayList<Integer>> G;// 邻接表实现图。

private boolean[] visited;//判断顶点是否被访问过

public GraphSearch(int n,List<ArrayList<Integer>> G){

this.n=n;

this.G=G;

visited = new boolean
;

}

public static void main(String[] args) {

int n,m;

List<ArrayList<Integer>> G;

Scanner sc = new Scanner(System.in);

n = sc.nextInt();

m = sc.nextInt();

G = new ArrayList<ArrayList<Integer>>();

for(int i = 0;i<n;i++)

G.add(new ArrayList<Integer>());//初始化邻接表

for(int i=0;i<m;i++) {

int u = sc.nextInt();

int v = sc.nextInt();

if(!G.get(u).contains(v)) {// 避免重边的情况比如a b可能出现两次的情况

G.get(u).add(v);

}

//对于无向图

if(!G.get(v).contains(u)) {

G.get(v).add(u);

}

}

GraphSearch ma=new GraphSearch(n,G);

//ma.dfs(0);

ma.bfs(0);

}

// 深搜

private void dfs(int v) {

visited[v] = true;

System.out.print(v+" ");

for (int i = 0; i <G.get(v).size(); i++) {

//递归调用搜索没有被访问过的当前节点的下一个节点(邻接点)

int k=G.get(v).get(i);

if (!visited[k])

dfs(k);

}

}

//广搜

private void bfs(int v) {

//队列用来保存被访问节点的分支节点(邻接点)

Queue<Integer> que = new LinkedList<Integer>();

que.offer(v);

while (!que.isEmpty()) {

v = que.poll();

System.out.print(v+" ");

visited[v] = true;

//将被访问节点的分支节点(邻接点)加入到队列中

for (int i = 0; i <G.get(v).size(); i++) {

int k=G.get(v).get(i);

if (!visited[k]){

que.add(k);

visited[k] = true;

}

}

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐