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();
}
}

浙公网安备 33010602011771号