首页 > 编程语言 >每日一道算法题之拓扑排序之按照最小字典输出

每日一道算法题之拓扑排序之按照最小字典输出

时间:2024-12-12 21:53:40浏览次数:5  
标签:int 拓扑 static heap new 排序 out public 字典

import java.io.*;
import java.util.*;

public class Main {

    public static int n = 100001;
    public static int m = 100001;

    public static ArrayList<ArrayList<Integer>> graph = new ArrayList<>();

    public static PriorityQueue<Integer> heap = new PriorityQueue<>();

    public static int[] indegree = new int[n];

    public static int[] ans = new int[n];

    public static int cnt = 0;

    public static void build() {
        graph.clear();
        heap.clear();
        cnt = 0;
        for (int i = 0; i < n; i++) {
            graph.add(new ArrayList<>());
        }
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StreamTokenizer in = new StreamTokenizer(br);
        PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
        while (in.nextToken() != StreamTokenizer.TT_EOF) {
            n = (int) in.nval + 1;
            in.nextToken();
            m = (int) in.nval;
            build();
            for (int i = 0, from, to; i < m; i++) {
                in.nextToken();
                from = (int) in.nval;
                in.nextToken();
                to = (int) in.nval;
                addEdge(from, to);
                indegree[to]++;
            }
            topoSort();
            for (int i = 0; i < n; i++) {
                out.print(ans[i] + " ");
            }
            out.println(ans[n - 1]);
        }
        out.flush();
        out.close();
        br.close();
    }

    private static void topoSort() {
        for (int i = 1; i < n; i++) {
            if (indegree[i] == 0) {
                heap.add(i);
            }
        }
        while (!heap.isEmpty()) {
            int cur = heap.poll();
            ans[cnt++] = cur;
            for (int i : graph.get(cur)) {
                indegree[i]--;
                if (indegree[i] == 0) {
                    heap.add(i);
                }

            }
        }

    }

    private static void addEdge(int from, int to) {
        graph.get(from).add(to);
    }
}

image

标签:int,拓扑,static,heap,new,排序,out,public,字典
From: https://www.cnblogs.com/clllll/p/18603522

相关文章

  • 排序算法-希尔排序
    介绍希尔排序也称缩小增量排序,属于插入排序中的一种排序算法,是在插入排序的基础上进行的改进,采用分组策略进行排序。相关特点时间复杂度:最好:O(n)、最坏:O(n2)、平均:O(n1.3)辅助空间复杂度:O(1)稳定性:不稳定排序原理希尔排序通过设定一个初始增量,将数组元素分组进行插入排序......
  • 华为机试HJ101 输入整型数组和排序标识,对其元素按照升序或降序进行排序
    首先看一下题描述输入整型数组和排序标识,对其元素按照升序或降序进行排序数据范围: 1≤n≤1000  ,元素大小满足 0≤val≤100000 输入描述:第一行输入数组元素个数第二行输入待排序的数组,每个数用空格隔开第三行输入一个整数0或1。0代表升序排序,1代表降序排序输出......
  • C语言-排序
    常见的排序算法分为以下四种,插入排序,选择排序,交换排序,归并排序。一、插入排序(一)直接插入排序直接插入排序,将一段数组看做被分成已排序序列和未排序序列,排序过程是从未排序序列的元素开始,该元素与已排序序列的元素从后向前扫描,找到第一个小于(或大于)该元素的已排序项,然后将......
  • 成绩排序
    输入nnn个同学的语文、数学、和英语成绩,计算他们的总分,要求按从高到低的顺序输出总分。【输入格式】第一行:输入1......
  • Python学习笔记 - 探索列表与字典的特殊操作
    Python编程的核心数据结构之一是列表和字典。列表是一种可以存储有序数据的容器,而字典是一种通过键值对存储数据的结构。灵活运用列表与字典可以使代码更具可读性和高效性,尤其是在处理大量数据时。本教程将系统地介绍列表和字典的一些特殊操作,包括基本用法、应用实例,并讲解......
  • 每日一道算法题之拓扑排序之课程表
    importjava.util.ArrayList;importjava.util.Deque;classSolution{publicint[]findOrder(intnumCourses,int[][]prerequisites){//思路:入度为0的点入队。依次出队的时候。遍历当前点的指向。入度减1,//如果入度为0.进队。//队......
  • PTA 7-1 通讯录排序
    输入n个朋友的信息,包括姓名、生日、电话号码,本题要求编写程序,按照年龄从大到小的顺序依次输出通讯录。题目保证所有人的生日均不相同。输入格式:输入第一行给出正整数n(<10)。随后n行,每行按照“姓名生日电话号码”的格式给出一位朋友的信息,其中“姓名”是长度不超过10的英文......
  • 选择排序
    选择排序这里也用到了冒泡排序的写法。由题说明,用指针方法对10个整数按由大到小顺序排序。首先声明选择排序基本和冒泡排序法一样,只不过多加了一个调用函数环节。在后面会说明我的错误电点,同时我也会在另一篇冒泡排序中详细文字叙述效果图和代码可参照本文。代码如下`#include......
  • datagridview点击列头对当前列进行排序的功能无效
    DataGridView的默认行为是支持通过单击列头对列进行排序,但在以下情况下可能会取消该功能或无法使用:1.绑定的数据源不支持排序如果DataGridView的数据源是绑定到一个不支持排序的集合(例如,List或未实现IBindingList的对象),排序功能会被禁用。2.列的SortMode设置为DataG......
  • 【数据结构——查找】二叉排序树(头歌实践教学平台习题)【合集】
    目录......