挑战程序设计竞赛(算法和数据结构)——12.4广度优先搜索的JAVA实现
Posted 小乖乖的臭坏坏
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了挑战程序设计竞赛(算法和数据结构)——12.4广度优先搜索的JAVA实现相关的知识,希望对你有一定的参考价值。
题目:
代码:
import java.util.*;
public class BreadthFirstSearch
public static void main(String[] args)
Scanner cin = new Scanner(System.in);
int n = cin.nextInt();
//建立图的邻接矩阵
int M[][] = new int[n][n];
for(int i=0;i<n;i++)
int id = cin.nextInt();
int degree = cin.nextInt();
for (int j=0;j<degree;j++)
int neighbour = cin.nextInt();
setMap(M, id, neighbour);
String[] color = new String[n];
Queue<Integer> Q = new ArrayDeque<Integer>();
int[] d = new int[n];
bfs_init(color, d, Q, M);
for (int i=0;i<n;i++)
System.out.println((i+1) + " " + d[i]);
public static void setMap(int[][] M, int id, int neighbour)
M[id-1][neighbour-1] = 1;
public static void bfs_init(String[] color, int[] d, Queue Q, int[][] M)
int n = color.length;
for (int i=0;i<n;i++)
color[i] = "white";
d[i] = Integer.MAX_VALUE;
color[0] = "grey";
Q.add(0);
d[0] = 0;
bfs(Q, 0, M, color, d);
public static void bfs(Queue<Integer> Q, int u/*记为当前处理的节点,状态为grey*/, int[][] M, String[] color, int[] d)
if(Q.size()==0)//只要队列里没有元素,那就结束了
return;
else//否则就没有结束
if(findNextElement(M, u)==-1)//如果不存在邻接点,则直接出队
color[u] = "black";
Q.remove();
if(Q.size()!=0)
u = Q.peek();//队头更改
else//存在邻接点
if(isAllSolved(color, M, u)==-1)//如果邻接点全部为灰色或黑色,则当前节点出队,并将队头元素改为新的当前节点
color[u] = "black";
Q.remove();
u = Q.peek();//队头更改
else//只要还有白色的节点
for (int i=0;i<color.length;i++)//遍历,白色的节点一个一个入队
if(M[u][i]==1 && color[i]=="white")//只要有连接且没有被处理过,则节点i入队
color[i] = "grey";
Q.add(i);
d[i] = d[u] + 1;
//做完了入队操作就可以让节点u出队了
color[u] = "black";
Q.remove();
u = Q.peek();//队头更改
bfs(Q, u, M, color, d);
public static void inQueue(int u, int v, String[] color, Queue Q, int[] d)
color[v] = "grey";
Q.add(v);
d[v] = d[u] + 1;
public static void outQueue()
//用于判断节点是否存在其他邻接节点
public static int findNextElement(int[][] M, int u)
int n = M.length;
for (int i=0;i<n;i++)
if(M[u][i]==1)return i;
return -1;
//用于判断节点的邻接节点有没有还未被处理的节点(color[i]=="white")
public static int isAllSolved(String[] color, int[][] M, int u)
int n = M.length;
for (int i=0;i<n;i++)
if(M[u][i]==1 && color[i]=="white")//只要存在还没有被处理的节点
return 1;
return -1;
输入:
4
1 2 2 4
2 1 4
3 0
4 1 3
输出:
1 0
2 1
3 2
4 1
以上是关于挑战程序设计竞赛(算法和数据结构)——12.4广度优先搜索的JAVA实现的主要内容,如果未能解决你的问题,请参考以下文章
挑战程序设计竞赛(算法和数据结构)——分割(下)&快速排序的JAVA实现
挑战程序设计竞赛(算法和数据结构)——19.2九宫格拼图问题的JAVA实现
挑战程序设计竞赛(算法和数据结构)——7.1归并排序JAVA实现
挑战程序设计竞赛(算法和数据结构)——16.13线段相交问题(曼哈顿算法)的JAVA实现