NOIP模拟 航班(scc强连通分量+树形DP/双Dfs)

本博客讨论了一道关于航班路径优化的问题,涉及到强连通分量(scc)和树形动态规划(DP)的算法。题目要求找出从每个城市出发,通过最少费用路线飞行到产生费用最多的城市。输入包括城市数量、航线信息,输出为每个城市的最大额外费用。解决方案包括使用Tarjan算法进行缩点,然后构建一棵树,通过两次DFS或树形DP来找到最费用路径。
摘要由CSDN通过智能技术生成

【题目描述】

L因为业务繁忙,经常会到处出差。因为他是航空公司的优质客户,于是某个航空公司给了他一个优惠券。

他可以利用这个优惠券在任何一个国家内的任意城市间免费旅行,当他的路线跨国才会产生费用。L有一个航空公司的价格表与航线。而且每个城市出发都能到所有的城市,2个城市间可能有不止一个航班,一个国家内的2个城市间一定有不同的路线,但是不同国家的城市间只有一条路线。L想知道从每个城市出发到产生费用最多的城市,不过你不能重复在一个航班上飞来飞去产生费用,必须沿最少的费用路线飞行。

【输入格式】

第一行,两个整数 N,M,表示N 个城市, M 条航线。

接下来 M 行,每行三个整数 a,b,c,表示城市 a,b 之间有一条费用为 c 的航线。

【输出格式】

共 N 行,第 i 行为从城市 i 出发到达每个城市额外费用的最大值。

【样例输入】

6 6

1 4 2

1 2 6

2 5 3

2 3 7

6 3 4

3 1 8

【样例输出】

4

4

4

6

7

7

【备注】

对于 40%的数据 1<=N<=1000,1<=M<=1000

对于 100%的数据 1<=N<=20000,1<=M<=200000

【题目分析】

首先,由于同一国家的城市之间并不需要花费,所以联想到tarjan缩点还是很容易的。

缩点完成后,根据国家与国家之间的航班建立一张图,由于题上说了不同国家的城市间只有一条路线,所以

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值