【NOIP 2014 提高组】寻找道路

今天打的一道水题,虽然因为打另一道模拟题打到模拟题只拿了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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值