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<>();
}
for(b=0;b<a;b++) {
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<c;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<b1;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<Integer> pq1=new PriorityQueue<>();
public static ArrayList<Integer>[] al1;
public static int[] in;
public static int[] time;
public static int[] answer;
}