P1113 杂务 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
本题使用拓扑排序,在这里简单说一下思路。
拓扑排序简单应用就是找到到达一个点有几条路径。
这个题我们要完成一个任务前要完成前置任务,我们把路径条数换成完成这个任务的时间就是答案
-
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import java.io.PrintWriter;
- import java.math.BigInteger;
- import java.math.MathContext;
- import java.security.PublicKey;
- import java.sql.SQLIntegrityConstraintViolationException;
- import java.util.ArrayList;
- import java.util.Arrays;
- import java.util.Collections;
- import java.util.Comparator;
- import java.util.Iterator;
- import java.util.LinkedList;
- import java.util.PriorityQueue;
- import java.util.Scanner;
- import java.util.TreeMap;
- import java.util.TreeSet;
- public class Main {
- public static void main(String[] args) throws NumberFormatException, IOException {
- Scanner sc=new Scanner(System.in);
- BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
- PrintWriter pw1=new PrintWriter(System.out);
- String[] aStrings=br.readLine().split(" ");
- int a=Integer.parseInt(aStrings[0]);
- al1=new ArrayList[a+1];//用来存储边,具体形式是a到b
- answer=new int[a+1];//完成每个任务的时间,总后我们在其中选取最长的就是答案
- in=new int[a+1];//每个任务的前置的任务数量
- time=new int[a+1];//每个任务单独完成的时间
- int b;
- for(b=0;b<=a;b++) {
- al1[b]=new ArrayList<>();
- }
- String[] bStrings=br.readLine().split(" ");
- int c=bStrings.length;
- int e=Integer.parseInt(bStrings[0]);
- int f=Integer.parseInt(bStrings[1]);
- time[e]=f;
- for(int d=2;d
- int g=Integer.parseInt(bStrings[d]);
- in[e]++;
- al1[g].add(e);//g指向e代表着g是e的前置任务
- }
- if(in[e]==1) {
- answer[e]=time[e];//一旦寻找到没有前置任务的任务我们就以他开端,并且完成他的时间也有了
- pq1.offer(e);//把前置任务完成的任务放入堆中追备计算
- }
- }
- int answer2=0;
- while(pq1.size()!=0) {
- int a1=pq1.poll();
- int b1=al1[a1].size();
- int c1=0;
- for(c1=0;c1
//找寻到所有以此任务为前置任务的任务把他们的前置任务减去一 - //知道前置任务为1时,停下。前置任务为1时就可以入堆准备完成它了
- in[al1[a1].get(c1)]--;
- int d1=al1[a1].get(c1);
- if(in[al1[a1].get(c1)]==1) {
- pq1.offer(d1);
- }
- answer[d1]=Math.max(answer[d1], answer[a1]+time[d1]);//没完成一个前置任务都要更新一下基于它的后置任务
- }
- }
- for(int i=1;i<=a;i++) {
- answer2=Math.max(answer2, answer[i]);
- }
- System.out.println(answer2);
- }
- public static PriorityQueue
pq1=new PriorityQueue<>(); - public static ArrayList
[] al1; - public static int[] in;
- public static int[] time;
- public static int[] answer;
- }
-
相关阅读:
「接口测试入门课」打卡学习 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