• 拓扑排序的应用之杂务


    P1113 杂务 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

    本题使用拓扑排序,在这里简单说一下思路。

    拓扑排序简单应用就是找到到达一个点有几条路径。

    这个题我们要完成一个任务前要完成前置任务,我们把路径条数换成完成这个任务的时间就是答案

    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.PriorityQueue;
    16. import java.util.Scanner;
    17. import java.util.TreeMap;
    18. import java.util.TreeSet;
    19. public class Main {
    20. public static void main(String[] args) throws NumberFormatException, IOException {
    21. Scanner sc=new Scanner(System.in);
    22. BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
    23. PrintWriter pw1=new PrintWriter(System.out);
    24. String[] aStrings=br.readLine().split(" ");
    25. int a=Integer.parseInt(aStrings[0]);
    26. al1=new ArrayList[a+1];//用来存储边,具体形式是a到b
    27. answer=new int[a+1];//完成每个任务的时间,总后我们在其中选取最长的就是答案
    28. in=new int[a+1];//每个任务的前置的任务数量
    29. time=new int[a+1];//每个任务单独完成的时间
    30. int b;
    31. for(b=0;b<=a;b++) {
    32. al1[b]=new ArrayList<>();
    33. }
    34. for(b=0;b
    35. String[] bStrings=br.readLine().split(" ");
    36. int c=bStrings.length;
    37. int e=Integer.parseInt(bStrings[0]);
    38. int f=Integer.parseInt(bStrings[1]);
    39. time[e]=f;
    40. for(int d=2;d
    41. int g=Integer.parseInt(bStrings[d]);
    42. in[e]++;
    43. al1[g].add(e);//g指向e代表着g是e的前置任务
    44. }
    45. if(in[e]==1) {
    46. answer[e]=time[e];//一旦寻找到没有前置任务的任务我们就以他开端,并且完成他的时间也有了
    47. pq1.offer(e);//把前置任务完成的任务放入堆中追备计算
    48. }
    49. }
    50. int answer2=0;
    51. while(pq1.size()!=0) {
    52. int a1=pq1.poll();
    53. int b1=al1[a1].size();
    54. int c1=0;
    55. for(c1=0;c1//找寻到所有以此任务为前置任务的任务把他们的前置任务减去一
    56. //知道前置任务为1时,停下。前置任务为1时就可以入堆准备完成它了
    57. in[al1[a1].get(c1)]--;
    58. int d1=al1[a1].get(c1);
    59. if(in[al1[a1].get(c1)]==1) {
    60. pq1.offer(d1);
    61. }
    62. answer[d1]=Math.max(answer[d1], answer[a1]+time[d1]);//没完成一个前置任务都要更新一下基于它的后置任务
    63. }
    64. }
    65. for(int i=1;i<=a;i++) {
    66. answer2=Math.max(answer2, answer[i]);
    67. }
    68. System.out.println(answer2);
    69. }
    70. public static PriorityQueue pq1=new PriorityQueue<>();
    71. public static ArrayList[] al1;
    72. public static int[] in;
    73. public static int[] time;
    74. public static int[] answer;
    75. }

  • 相关阅读:
    「接口测试入门课」打卡学习 day09:微服务接口:怎么用Mock解决混乱的调用关系
    (学习日记)2022.7.29
    Web API:ResizeObserver——监听元素大小的变化
    TCP 流量控制与拥塞控制
    关于 axios 是什么?以及怎么用?
    Python与CAD系列基础篇(八)创建标注并修改样式
    【编程之路】面试必刷TOP101:动态规划(入门)(62-66,Python实现)
    随想:卖包子送了杯豆浆
    ant-design国际化扩展新语言
    【shell】linux通过complete命令完成使用tab键自动补全
  • 原文地址:https://blog.csdn.net/m0_73862548/article/details/133716670