本周各种最短路
A - TT 的魔法猫
题目描述
有一张游戏胜负表,上面有 N 个人以及 M 个胜负关系,每个胜负关系为 A B,表示 A 能胜过 B,且胜负关系具有传递性。即 A 胜过 B,B 胜过 C,则 A 也能胜过 C。
TT 不相信他的小猫咪什么比赛都能预测,因此他想知道有多少对选手的胜负无法预先得知
输入
1 | 第一行给出数据组数。 |
输出
1 | 对于每一组数据,判断有多少场比赛的胜负不能预先得知。注意 (a, b) 与 (b, a) 等价,即每一个二元组只被计算一次。 |
题目分析
- 因为有传递性,所以符合图的连通性。
- 因此可以直接01 floyd判断联通就可
- 要注意数据范围较大,考虑显然的剪枝:a如果无法到达k,那么就不用考虑k是否能到达b了
代码
1 |
|
B - TT 的旅行日记
题目描述
TT 从家里出发,准备乘坐猫猫快线前往喵星机场。猫猫快线分为经济线和商业线两种,它们的速度与价钱都不同。当然啦,商业线要比经济线贵,TT 平常只能坐经济线,但是今天 TT 的魔法猫变出了一张商业线车票,可以坐一站商业线。假设 TT 换乘的时间忽略不计,请你帮 TT 找到一条去喵星机场最快的线路,不然就要误机了!
输入
输入包含多组数据。每组数据第一行为 3 个整数 N, S 和 E (2 ≤ N ≤ 500, 1 ≤ S, E ≤ 100),即猫猫快线中的车站总数,起点和终点(即喵星机场所在站)编号。
下一行包含一个整数 M (1 ≤ M ≤ 1000),即经济线的路段条数。
接下来有 M 行,每行 3 个整数 X, Y, Z (1 ≤ X, Y ≤ N, 1 ≤ Z ≤ 100),表示 TT 可以乘坐经济线在车站 X 和车站 Y 之间往返,其中单程需要 Z 分钟。
下一行为商业线的路段条数 K (1 ≤ K ≤ 1000)。
接下来 K 行是商业线路段的描述,格式同经济线。
所有路段都是双向的,但有可能必须使用商业车票才能到达机场。保证最优解唯一。
输出
对于每组数据,输出3行。第一行按访问顺序给出 TT 经过的各个车站(包括起点和终点),第二行是 TT 换乘商业线的车站编号(如果没有使用商业线车票,输出”Ticket Not Used”,不含引号),第三行是 TT 前往喵星机场花费的总时间。
本题不忽略多余的空格和制表符,且每一组答案间要输出一个换行
题目分析
目前来说 一共有三种做法
先从起点终点开始分别跑两遍最短路,然后枚举所有商业线,并记录dis[s] + dis[e] + w 与不使用商业线的最小值。
dis数组加一维0/1,如果到当前节点使用了商业线则是1,未使用则是0.1则接下来只能向走非商业线连接的节点转移,如果是0则商业线和非商业线连接的节点都可以走。
分层图;两层图,所有商业线是第一层到第二层图的连接线,跑一边即可。
细节:
- 因为是万恶的多组数据,而且卡PE(可以说是十分恶心了),因此输出要十分注意不要多输出空格;
- 还要记得每组数据计算完之后清空各种数组、队列;
- 还要记得方法1的两段路径输出方式不一样;
- 还要记得dis初始值inf不能太大否则会溢出,推荐好用的
0x3f3f3f3f
; - 总之十分十分难调,从方法二换到方法一,从SPFA换到DJi
代码
1 |
|
C - TT 的美梦
题目描述
1 | 喵星上共有 M 条有向道路供商业城市相互往来。但是随着喵星商业的日渐繁荣,有些道路变得非常拥挤。正在 TT 为之苦恼之时,他的魔法小猫咪提出了一个解决方案!TT 欣然接受并针对该方案颁布了一项新的政策。 |
输入
1 | 第一行输入 T,表明共有 T 组数据。(1 <= T <= 50) |
输出
1 | 每个询问输出一行,如果不可达或税费小于 3 则输出 '?'。 |
题目分析
- 可能存在负环的最短路问题,直接用SPFA记录某个节点是否入队n次即可;
- 某个点入队n次-> 这个点所在连通块有负环-> 负环上所有点均不可到达-> dfs该点记录一下;
- 输出描述有些问题,应该是每组数据前都要加一个Case x:
代码
1 |
|