【JAVA】有向无环图到达固定点的最大深度及分值(Pro20210910)(拓扑排序)

本文介绍了一种解决有向无环图(DAG)问题的方法,目标是找到从任一节点出发到达终点1号节点的路径,使得路径上的节点总数最多并且得分最高。题目给出了关卡和道路的限制条件,并要求通过拓扑排序来求解。通过拓扑排序,从入度为0的节点开始,选择深度最大且分值高的节点,最终求得最大得分。
摘要由CSDN通过智能技术生成

【JAVA】有向无环图到达固定点的最大深度及分值(Pro20210910)(拓扑排序)

题目

智宇决定参加在某星球举办的竞赛。整个竞赛场地共有 N 个关卡,分别从 1 到 N 进行编号,通过连接两个关卡的 M 条单行道连通这 N 个关卡。每个关卡只能经过一次,关卡 1 始终为终点。
在这场竞赛中,智宇可以任意选择在哪个关卡出发,然后在到达终点前,获取尽量多的积分。竞赛最终获得的总分为“各关卡号码乘以到达该关卡前经过的关卡个数加1”的总和。因为乘数是经过的关卡数量加1,所以智宇在出发点的第一个关卡上就能获得积分。
智宇认为经过越多的关卡会越有利,所以他计划途径尽量多的关卡。
在这里插入图片描述

如 [图] 所示,有多种路径选择可以抵达终点,但能途径最多数量关卡的路径只有 (⑧ → ④ → ③ → ② → ①),走这条路线获得的总分是 38 分 (⑧1 + ④2 + ③3 + ②4 + ①*5)。
在这里插入图片描述

[图 2]
如果关卡的设置如 [图2] 所示,则 (⑧ → ④ → ③ → ⑦ → ①) 路线不仅关卡是最多的,还可以获得比 (⑧ → ④ → ③ → ② → ①) 路线更高的分数。
※ 如果智宇走 ⑧ → ④ → ③ → ⑦ → ① 这条路线,可以获得 58 分 (⑧1 + ④2 + ③3 + ⑦4 + ①*5)。
根据给出的竞赛信息,帮助智宇选出途径最多关卡,并获得最多分数的路线,同时计算出得分。

[限制条件]
1.关卡数量 N 为介于 2 到 100,000 之间的整数。
2.连接关卡的道路数量 M 为介于 1 到 200,000 之间的整数。
3.不存在经过一次的关卡还能再次经过的情况。
4.可以从任意关卡开始,但终点必须是 1 号关卡。

[输入]
首先,给定测试用例数量 T,后面接着输入 T 种测试用例。在每个测试用例的第一行,给定关卡数量 N 和道路数量 M,以空格分隔。接下来的 M 行,每行给定一条道路信息(道路起始点关卡编号 A 和目的地关卡编号 B),以空格分隔。
[输出]
每行输出一个测试用例。首先,输出#x(其中 x 表示测试用例编号,从 1 开始)加上一个空格,然后输出智宇按计划比赛时获得的最大分数。

[输入和输出示例]
(输入)
3
8 9
8 4
8 6
5 6
4 2
4 3
3 2
6 7
7 1
2 1
8 10
8 4
8 6
5 6
4 2
4 3
3 2
6 7
7 1
2 1
3 7
7 8
7 4
7 5
4 3
4 2
3 2
2 1
5 6
6 1
(输出)
#1 38
#2 58
#3 37

思路

有向无环图,特点是一定存在入度为0和出度为0的点。
要求深度最大,那一定是从入度是0的点开始,向1号点移动。
对于途径的点,取深度最大且分值最高的数据。
所以,拓扑排序即可。

代码

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.StringTokenizer;

public class Main {
   
	static int T, N, M;
	static long ASW[][]; // 第一行:入度; 第二行:深度; 第三行:分数
	static ArrayList<Integer>[] DATA; 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值