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;
    }
}
复制代码

 

posted @   Mars.wang  阅读(357)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示