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 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
| package org.stone.study.algo.ex202411;
import java.util.*; import java.util.stream.Collectors;
public class DependencySort { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String dependency = scanner.nextLine(); String res = sortByDependency(dependency); System.out.println(res); }
private static String sortByDependency(String dependencyStr) { String[] arr = dependencyStr.split(" "); Map<Character, List<Character>> dependencyMap = new HashMap<>(); Map<Character, Integer> inDegree = new HashMap<>(); Set<Character> taskSet = new HashSet<>();
for (String dep : arr) { String[] depArr = dep.split("->"); char dependent = depArr[0].charAt(0); char dependency = depArr[1].charAt(0); dependencyMap.putIfAbsent(dependency, new ArrayList<>()); dependencyMap.get(dependency).add(dependent); inDegree.put(dependent, inDegree.getOrDefault(dependent, 0) + 1); if(!inDegree.containsKey(dependency)) { inDegree.put(dependency, 0); } taskSet.add(dependent); taskSet.add(dependency); }
Queue<Character> queue = new LinkedList<>(); for (char task : inDegree.keySet()) { if (inDegree.get(task) == 0) { queue.offer(task); } } List<Character> ans = new ArrayList<>(); while (!queue.isEmpty()) { Character cur = queue.poll(); ans.add(cur); for (Character dependent : dependencyMap.getOrDefault(cur, Collections.emptyList())) { inDegree.put(dependent, inDegree.get(dependent) - 1); if (inDegree.get(dependent) == 0) { queue.offer(dependent); } } }
if(ans.size() == taskSet.size()) { return ans.stream().map(String::valueOf).collect(Collectors.joining(" ")); } else { return "ERROR"; } } }
|