jav实现有向无环图拓扑排序
@Data @AllArgsConstructor @NoArgsConstructor public class Graph { private Set<String> nodes; private List<Pair<String, String>> table; public void remove(String node) { this.nodes.remove(node); table.removeIf(pair -> pair.getFrom().equals(node) || pair.getTo().equals(node)); } public static void main(String[] args) { Set<String> nodes = Sets.newHashSet("A", "B", "C", "D", "E", "F", "G"); List<String> edges = Lists.newArrayList("G->E", "G->F", "E->D", "F->C","C->B", "C->A","B->A"); List<Pair<String, String>> pairList = edges.stream().map(edge -> { String[] split = edge.split("->"); String start = split[0]; String end = split[1]; return new Pair<>(start, end); }).collect(Collectors.toList()); Graph graph = new Graph(nodes, pairList); Map<String, Integer> inDegree = getInDegree(graph); System.out.println(inDegree); List<String> priority = findPriority(graph); System.out.println(priority); } /** * 获取图中节点的入度 * @param graph * @return */ public static Map<String, Integer> getInDegree(Graph graph) { Set<String> nodes = graph.getNodes(); List<Pair<String, String>> connectTable = graph.getTable(); Map<String, Integer> map = new ConcurrentHashMap<>(); for (String node : nodes) { map.put(node,0); } for (Pair<String, String> pair : connectTable) { map.computeIfPresent(pair.getTo(), (k, v) -> v + 1); } return map; } /** * 始终寻找入度为0的点,直到所有节点加入结果队列 * @param graph * @return */ public static List<String> findPriority(Graph graph) { List<String> list = new ArrayList<>(); Set<String> nodes = graph.getNodes(); Map<String, Integer> inDegree = getInDegree(graph); int size = nodes.size(); int count=0; while (count<size&&inDegree.keySet().size()!=0) { System.out.println(inDegree); for (Map.Entry<String, Integer> entry : inDegree.entrySet()) { String key = entry.getKey(); if (entry.getValue() == 0) { list.add(key); count++; graph.remove(key); inDegree = getInDegree(graph); } } } return list; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗