拓扑排序的应用之杂务

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; 
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值