今天第二场cf div2的E,数组大小是没有问题的。
#include <iostream>
#include <cmath>
#include <string>
#include <cstring>
#include <iomanip>
#include <algorithm>
#include <vector>
#include <cstdio>
#include <queue>
#include <map>
#include <set>
#define int long long
using namespace std;
const int N = 5e5 + 55, inf = 2147483647;
int n, t, tot, k;
int h[N], vis[N], b[N];
struct edge {
int v, w, nxt;
} e[N << 1];
vector<int> a[N];
void add(int x, int y, int z) {
e[++tot] = {y, z, h[x]};
h[x] = tot;
}
struct node {
int id, step;
};
int find(int z, int kk){
int l = 0, r = a[z].size() - 1;
while (l < r) {
int mid = (l + r) >> 1;
if (a[z][mid] <= kk) l = mid + 1;
else r = mid;
}
return a[z][l];
}
int bfs() {
queue<node> q;
int ans = 1e9;
q.push({1, 0});
vis[1] = 1;
while (q.size()) {
node f = q.front();
q.pop();
if (f.id == n) {
ans = min(ans, f.step);
continue;
}
if (f.step == k) {
if (q.size() == 0) break;
continue;
}
for (int i = h[f.id]; i; i = e[i].nxt) {
if (vis[e[i].v] == 0) {
int rr = find(e[i].w, f.step);
if (rr > f.step) q.push({e[i].v, rr});
vis[e[i].v] = 1;
}
}
}
if (ans == 1e9) return -1;
return ans;
}
signed main() {
scanf("%lld%lld", &n, &t);
for (int i = 1; i <= t; i++) {
int m;
scanf("%lld", &m);
for (int j = 1; j <= m; j++) {
int x, y;
scanf("%lld%lld", &x, &y);
add(x, y, i);
add(y, x, i);
}
}
scanf("%lld", &k);
for (int i = 1; i <= k; i++) {
scanf("%lld", &b[i]);
a[b[i]].push_back(i);
}
printf("%lld\n", bfs());
return 0;
}