PAT甲级1004【1004 Counting Leaves】

本题考查广度优先搜索:

BFS(图论)

BFS 全称是 Breadth First Search,中文名是宽度优先搜索,也叫广度优先搜索。

是图上最基础、最重要的搜索算法之一。

所谓宽度优先。就是每次都尝试访问同一层的节点。 如果同一层都访问完了,再访问下一层。

这样做的结果是,BFS 算法找到的路径是从起点开始的 最短 合法路径。换言之,这条路径所包含的边数最小。

在 BFS 结束时,每个节点都是通过从起点到该点的最短路径访问的。

算法过程可以看做是图上火苗传播的过程:最开始只有起点着火了,在每一时刻,有火的节点都向它相邻的所有节点传播火苗。

 

代码如下:

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    @SuppressWarnings("unchecked")
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n, m;
        String[] words = br.readLine().split("\\s+");
        n = Integer.valueOf(words[0]);
        m = Integer.valueOf(words[1]);
        List<Integer>[] g = new ArrayList[n+1];
        for (int i = 0; i <=n; i++) {
            g[i] = new ArrayList<>();
        }
        for (int i = 0; i < m; i++) {
            words = br.readLine().split("\\s+");
            int id = Integer.valueOf(words[0]);
            int k = Integer.valueOf(words[1]);
            for (int j = 0; j < k; j++) {
                g[id].add(Integer.valueOf(words[2 + j]));
            }
        }

        Map<Integer, Integer> map = new HashMap<>();
        int levelnum = 1;
        ArrayDeque<Integer> queue = new ArrayDeque<>();
        queue.add(1);
        int nextlevelnum = 0;
        int travedcurrlevelnum = 0;
        int currlevel = 0;

        while (!queue.isEmpty()) {
            int node = queue.poll();

            if (g[node].size() == 0) {
                map.put(currlevel, map.getOrDefault(currlevel, 0) + 1);
            }

            travedcurrlevelnum++;

            for (int child : g[node]) {
                nextlevelnum++;
                queue.add(child);
            }

            if (travedcurrlevelnum == levelnum) {
                levelnum = nextlevelnum;
                travedcurrlevelnum = 0;
                currlevel++;
                nextlevelnum = 0;
            }
        }

        for (int i = 0; i < currlevel; i++) {
            if( i != 0){
                System.out.print(" ");
            }
            System.out.print(map.getOrDefault(i,0));
        }
        System.out.println();


        br.close();

    }

}

 

posted @ 2023-10-21 17:06  fishcanfly  阅读(10)  评论(0)    收藏  举报
//雪花飘落效果