挑战程序设计竞赛(算法和数据结构)——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实现

挑战程序设计竞赛(算法和数据结构)——3.6希尔排序的JAVA实现

挑战程序设计竞赛(算法和数据结构)——3.6希尔排序的JAVA实现