https://www.luogu.com.cn/record/53276456
#include<iostream>
#include<bitset>
#include<vector>
#include<tuple>
#include<queue>
#define endl '\n'
#define QAQ(m, n) for(int i = m;i <= n;++i)
#define QWQ(m, n) for(int j = m;j <= n;++j)
namespace IO{/*这里是快读板子*/}using namespace IO;
int n, m, s, t, b, p;
std::vector<int> Doges[30010];
std::bitset<30010> vis[30010];
std::queue<std::tuple<int, int, int> > q;
bool V[30010];
inline void Add (int pos, int p, int step)
{
if (pos == t) println (step), exit (0);
if (!V[pos])
{
V[pos] = true;
for (auto Doge : Doges[pos])
if (!vis[pos].test (Doge))
vis[pos].set (Doge), q.emplace (pos, Doge, step);
}
if (!vis[pos].test (p)) vis[pos].set (p), q.emplace (pos, p, step);
}
int main ()
{
std::cin.tie (0), std::ios::sync_with_stdio (false);
read (n), read (m);
QAQ (0, m - 1)
{
read (b), read (p), Doges[b].push_back (p);
if (!i) s = b;
if (i == 1) t = b;
}
if (s == t) println (0), exit (0);
V[s] = true;
for (int Doge : Doges[s]) if (!vis[s].test (Doge)) vis[s].set (Doge), q.emplace (s, Doge, 0);
while (!q.empty ())
{
int now, p, step;
std::tie (now, p, step) = q.front (), q.pop ();
if (now - p >= 0) Add (now - p, p, step + 1);
if (now + p < n) Add (now + p, p, step + 1);
}
println (-1);
return 0;
}
有无大佬帮我卡常呜呜呜