今天打的一道水题,虽然因为打另一道模拟题打到模拟题只拿了20分 但是也不太影响它水题的本质,先放题面。
光这么看其实有点难理解的,配上它给的样例解释就能看懂了
我起初理解的题意是,如果出现了没有到达终点的点,那么就输出-1,然后就只有20分了。
实际上是,如果这条路径上有个点连着的点没到达终点,那么这一整条边作废,另寻他路。
故而能想到,从终点开始跑一遍,也就是倒着跑一遍,从终点跑到起点,这样能先找出能够到达终点的点,标记到一个数组里,然后循环一遍,看看这些能到达终点的点是不是连着,不能到达终点的点。
举个例子,
就这一张图,如果你从五开始倒着跑一遍,那么很明显,1,2,3,4,5都可以到达5
但是问题在于,2连着一个6,这个6没办法到达5,所以2这个点没办法走,那么再创建一个数组,把不能走的点都存起来,最后从起点跑到终点,注意观察这些点是不是能走就可以了。
上代码吧
#include<bits/stdc++.h>
using namespace std;
struct EDGE
{
int v;
int next;
};
EDGE edge1[200086],edge2[200086];
int head1[200086],head2[200086];
int num1=1,num2=1;
inline void add1(int u,int v)
{
edge1[num1].v=v;
edge1[num1].next=head1[u];
head1[u]=num1