1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| class Solution { public int[] countVisitedNodes(List<Integer> g) { int n = g.size(); int[] degree = new int[n]; List<Integer>[] rg = new List[n]; Arrays.setAll(rg, e -> new ArrayList<>()); for (int i = 0; i < n; ++i) { int from = i, to = g.get(i); degree[to]++; rg[to].add(from); } Queue<Integer> queue = new LinkedList<>(); for (int i = 0; i < n; ++i) if (degree[i] == 0) queue.offer(i); while (!queue.isEmpty()) { int node = queue.poll(); int next = g.get(node); if (--degree[next] == 0) queue.offer(next); } int[] res = new int[n]; for (int i = 0; i < n; ++i) { if (degree[i] <= 0) continue; List<Integer> ring = new ArrayList<>(); int j = i; while (true) { ring.add(j); degree[j] = -1; j = g.get(j); if (j == i) break; } for (int x : ring) dfs(x, ring.size(), rg, res, degree); } return res; }
private void dfs(int x, int size, List<Integer>[] rg, int[] res, int[] degree) { res[x] = size; for (int next : rg[x]) { if (degree[next] == 0) dfs(next, size + 1, rg, res, degree); } }
}
|