題名
ポータルP3645 [APIO2015]ジャカルタの高層ビル
回答
エッジの重みは11です図1、BFS BFSB FSは問題ありません。ドージェドージェを検討してくださいD o g eの状態は、(b、p)(b、p)を使用した2タプルの位置とジャンプ能力です。(b 、p )はを意味します。ジャンプ能力がppの場合p、到達可能な位置の数はN / p N / pです。N / p。
分割統治をルートで検討してください。p <N p <\ sqrtNの場合p<N、状態の数は最大でO(NN)O(N \ sqrt N)O (NN) ;p≥Nの場合p \ geq \ sqrt Np≥N、状態の数は最大でO(MN)O(M \ sqrt N)O (MN)。STLビットセットSTL \ビットセットS T L b i t s e t レコードステータス、BFS BFSB F Sソリューション、合計時間計算量O(NN)O(N \ sqrt N)O (NN)。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 30005, maxs = 10000005;
struct node
{
int b, p, d;
} Q[maxs];
int N, M, S, T, L, R;
bool vsb[maxn];
vector<int> pos[maxn];
bitset<maxn> vs[maxn];
inline void psh(int b, int p, int d)
{
if (!vs[b][p])
Q[++R] = node{
b, p, d}, vs[b][p] = 1;
}
inline void upd(int b, int p, int d)
{
psh(b, p, d);
if (!vsb[b])
{
vsb[b] = 1;
for (auto &q : pos[b])
psh(b, q, d);
}
}
int bfs()
{
vsb[S] = 1;
L = 1, R = 0;
for (auto &p : pos[S])
psh(S, p, 0);
while (L <= R)
{
node &t = Q[L++];
if (t.b == T)
return t.d;
if (t.b - t.p >= 0)
upd(t.b - t.p, t.p, t.d + 1);
if (t.b + t.p < N)
upd(t.b + t.p, t.p, t.d + 1);
}
return -1;
}
int main()
{
scanf("%d%d", &N, &M);
for (int i = 0, b, p; i < M; ++i)
{
scanf("%d%d", &b, &p), pos[b].push_back(p);
if (i == 0)
S = b;
if (i == 1)
T = b;
}
printf("%d\n", bfs());
return 0;
}