拓扑,DP noip 模拟赛 [益智游戏] 题解

题目:益智游戏

(!!!本题很卡时间!!!)

题目描述:

小 P 和小 R 在玩一款益智游戏。游戏在一个正权有向图上进行。
小 P 控制的角色要从 A 点走最短路到 B 点,小 R 控制的角色要从 C 点走最短路到 D 点。
一个玩家每回合可以有两种选择,移动到一个相邻节点或者休息一回合。
假如在某一时刻,小 P 和小 R 在相同的节点上,那么可以得到一次特殊奖励,但是在每个节点上最多只能得到一次。
求最多能获得多少次特殊奖励。

输入:

第一行两个整数 n,m 表示有向图的点数和边数。
接下来 m 行每行三个整数 xi,yi,li,表示从 xi到 yi有一条长度为 li的边。
最后一行四个整数 A,B,C,D,描述小 P 的起终点,小 R 的起终点。

输出:

一个整数表示最多能获得多少次特殊奖励。若小 P 不能到达 B 点或者小 R 不能到达 D点则输出-1。

样例输入:

5 5
1 2 1
2 3 2
3 4 4
5 2 3
5 3 5
1 3 5 4

样例输出:

2

简析:

首先,要保证两人都是走的最短路,如果不能到达则输出-1。
然后我们从所有的点中筛选出被两条最短路同时包含的点,再在原图的基础上将这些点建一个新图,用拓扑排序跑一遍(找出最多的公共点,即最长路)。
以上是大致思路。
接下来逐个解决几个问题:
1.Q:跑最短路需要注意什么?
A:跑最短路最好用算法:Dijkstra+优先队列优化。
2.Q:如何找出哪些点同 时在两条最短路中?
A:首先用静态链接表建好图(正反都要建),然后跑四遍最短路,从起点A到终点B,从终点B到起点A,从起点C到终点D,从终点D到起点C,同时用四个数组dis记录下每个点到这四个殊点的最短距离。假设存在一条u到v的边(u指向v),如果A到u的距离+v到B的距离+u到v的距离==A到B的距离,那么u,v两点在A到B最短路中,若同理判 断出u,v同时在C到D的最短路上,那么 v的入度+1,(什么是入度?拓扑排序的内容,不会的话去学习一波),并且将u,v加入新图中(加入什么新图?也是拓扑排序要用的)。
3.Q:关DP什么事儿?
A:我也不太清楚,不过似乎好像大约用到了。
4.Q:还有什么要需要注意的吗?
A:这题要开很多东西,先想清楚在动手,不然就像我一样,用生命去改代码。

代码:

#include<stdio.h>
#include<string.h>
#include<queue>
#include<vector>
#include<algorithm>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值