原题链接:https://www.luogu.org/problem/show?pid=2296
*已更新
思路具体还是有的,不过代码出现了一些bug,我正在调试。
题目给了一个有向图,让我们在图中找一条从起点到终点的路径,该路径满足两个条件:
1.路径上的所有点的出边所指向的点都直接或间接与终点连通。
2.在满足条件1的情况下使路径最短。
要判定某个点是不是满足条件1,从正向进行广搜肯定是不太合理的,因为没办法判定。有一种方法是反向建图和搜索,搜索完之后再去枚举所有边,把不合适的删去,然后就是一个bfs裸图。
我用的方法和这个不太一样,不过这好像时间爆炸。。如果用dfs空间也爆炸。。
我们可以在读入的时候记录所有入度为0的点,读入完毕建立完图后,枚举这所有的入度为0的非起点的点,从这个点出发能到的非终点的点全打一个标记,然后进行bfs,只要在走的时候加个判定不走那个位置就好。
因为路径长度都是1,所以可以不写spfa,bfs时发现连接点是终点时直接输出就好,无解输出-1.
估计是更不完了。。。。。
我后来想了想,我那个方法是错的。
还是得先反向建图,找到所有可能到达的点,那些不能到达的点,其相连的点便一定不能走。所以这一遍bfs执行完毕后,正向建图,跑最短路的时候加一个判断,即判断这个点所连接的所有点是不是都能走,如果不能的话这个点是不能走的。其余的操作和正常求最短路的方法是类似的。