• 拓扑排序之车站分级


    P1983 [NOIP2013 普及组] 车站分级 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

    由于Java速度的局限性,即使我写了基础的快读快输,仍然在第8个样例点处tle

    大家可以自行去洛谷下载来验证

    思路是这样的,我们把所有列车未停靠的车站指向已经停靠的车站,在这里,我们要记住去重,然后我们记录这些车站的先后关系。设置分级数组,默认每个车站的等级是一级,然后我们开始拓扑排序,a号车站链接的b号车站的等级等于b号的等级和a号车站的等级加1做对比取最大。

    为什么呢,原因很简单,要最小的分级数量,那么我们就加一即可。

    代码

    1. import java.io.BufferedReader;
    2. import java.io.IOException;
    3. import java.io.InputStreamReader;
    4. import java.io.PrintWriter;
    5. import java.math.BigInteger;
    6. import java.math.MathContext;
    7. import java.security.PublicKey;
    8. import java.sql.SQLIntegrityConstraintViolationException;
    9. import java.util.ArrayList;
    10. import java.util.Arrays;
    11. import java.util.Collections;
    12. import java.util.Comparator;
    13. import java.util.Iterator;
    14. import java.util.LinkedList;
    15. import java.util.Objects;
    16. import java.util.PriorityQueue;
    17. import java.util.Scanner;
    18. import java.util.TreeMap;
    19. import java.util.TreeSet;
    20. import javax.sound.midi.Soundbank;
    21. public class Main {
    22. public static void main(String[] args) throws NumberFormatException, IOException {
    23. Scanner sc=new Scanner(System.in);
    24. BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
    25. PrintWriter pw1=new PrintWriter(System.out);
    26. String[] aStrings=br.readLine().split(" ");
    27. aa=Integer.parseInt(aStrings[0]);
    28. bb=Integer.parseInt(aStrings[1]);
    29. al1=new ArrayList[aa+1];
    30. visited=new int[aa+1];
    31. rudu=new int[aa+1];
    32. answer=new int[aa+1];
    33. cc=new int[aa+1][aa+1];
    34. int a,b,c,d,e,f,g;
    35. for(a=1;a<=aa;a++) {
    36. al1[a]=new ArrayList<>();
    37. }
    38. for(a=0;a<bb;a++) {//这就是用来存储边的过程
    39. String[] bStrings=br.readLine().split(" ");
    40. b=Integer.parseInt(bStrings[0]);
    41. c=bStrings.length;
    42. Arrays.fill(visited, 0);
    43. for(d=1;d<c;d++) {
    44. e=Integer.parseInt(bStrings[d]);
    45. visited[e]=1;
    46. }
    47. f=Integer.parseInt(bStrings[1]);
    48. g=Integer.parseInt(bStrings[c-1]);
    49. for(int a1=f;a1<=g;a1++) {
    50. if(visited[a1]==0) {
    51. for(int b1=1;b1<c;b1++) {
    52. int c1=Integer.parseInt(bStrings[b1]);
    53. if(cc[a1][c1]==0) {
    54. cc[a1][c1]=1;
    55. al1[a1].add(c1);
    56. rudu[c1]++;
    57. }
    58. }
    59. }
    60. }
    61. }
    62. tuopu();
    63. int answer3=0;
    64. for(int c22=1;c22<=aa;c22++) {
    65. answer3=Math.max(answer3, answer[c22]);
    66. }
    67. System.out.println(answer3);
    68. }
    69. public static int aa,bb; //记录车站的数量和几条路线
    70. public static ArrayList<Integer>[] al1;//存储边
    71. public static LinkedList<Integer> ll1=new LinkedList<>();//存储入度为0的点
    72. public static int[] rudu;//入度数组
    73. public static int[] answer;//每个点的等级数组
    74. public static int[][] cc;//判断是否已经存入a到b的一条边,这个数组是为了我们来去重边时所用
    75. public static int[] visited;//判断一条路线中已经被经过的车站的编号
    76. public static void tuopu() {
    77. int a;
    78. Arrays.fill(answer, 1);//初始把每个车站的等级设为1级。
    79. for(a=1;a<=aa;a++) {
    80. if(rudu[a]==0) {
    81. ll1.add(a);
    82. }
    83. }
    84. while(ll1.size()!=0) {//取出入度为0的点
    85. int d=ll1.remove();
    86. for(int c:al1[d]) {
    87. rudu[c]--;
    88. answer[c]=Math.max(answer[c], answer[d]+1);//不断更新等级
    89. if(rudu[c]==0) {//入度为0了,那么就继续汪队列里面添加
    90. ll1.add(c);
    91. }
    92. }
    93. }
    94. }
    95. }

  • 相关阅读:
    最简单的tab选项卡
    大学4年做出来这个算不算丢人
    AtCoder Beginner Contest 228(A-Ex)
    FPGA工程师面试试题集锦11~20
    银联扫码支付及静态码回调验签
    汇编:循环结构
    Adobe Premiere基础-常用的视频特效(十五)
    Python+AI给老照片上色
    WorkManager学习一
    WPF Datagrid Header数据绑定,表头复选框实现全选、全否、部分选中,根据条目动态变化
  • 原文地址:https://blog.csdn.net/m0_73862548/article/details/133826809