#include <bits/stdc++.h>
using namespace std;
typedef pair <int, int> PII;
const int N = 1E6 + 10, M = 2e6 + 10;
int head[N], rhead[N], ver[M * 2], nxt[M * 2], edge[M * 2], tot;
int n, m;
int s, t;
int fa[N];
int get(int x)
{
if (x == fa[x]) return x;
return fa[x] = get(fa[x]);
}
void add(int *h, int x, int y)
{
ver[++ tot] = y;
edge[tot] = 1;
nxt[tot] = h[x];
h[x] = tot;
}
int q1[N];
bool st[N];
void bfs1(int s)
{
int hh = 0, tt = -1;
q1[++ tt] = s;
while(hh <= tt)
{
int x = q1[hh ++];
if (st[x]) continue;
else st[x] = true;
for (int i = rhead[x]; i; i = nxt[i])
{
int y = ver[i];
int a = get(x), b = get(y);
fa[a] = b;
q1[++ tt] = y;
}
}
}
int dist[N];
bool v[N];
priority_queue <PII, vector<PII>, greater<PII> > q;
void dijkstra(int s, int t)
{
memset (dist, 0x3f, sizeof dist);
q.push({0, s});
dist[s] = 0;
while(q.size())
{
int x = q.top().second;
q.pop();
if (v[x]) continue;
v[x] = true;
for (int i = head[x]; i; i = nxt[i])
{
int y = ver[i], z = edge[i];
bool flag = true;
for (int j = head[y]; j; j = nxt[j])
if (fa[ver[j]] != fa[t]) flag = false;
if (dist[y] > dist[x] + edge[i] && flag)
{
dist[y] = dist[x] + edge[i];
q.push({dist[y], y});
}
}
}
if (dist[t] == 0x3f3f3f3f) puts("-1");
else cout << dist[t] << endl;
}
int main()
{
cin >> n >> m;
for (int i = 1; i <= m; i ++ )
{
int x, y;
cin >> x >> y;
add(head, x, y);
add(rhead, y, x);
}
cin >> s >> t;
for (int i = 1; i <= n; i ++ ) fa[i] = i;
bfs1(t);
for (int i = 1; i <= n; i ++ ) get(i);
dijkstra(s, t);
return 0;
}
这个是可以AC的代码, 但是如果我们把const int N = 1E6 + 10的6改为5,那么就会RE第二个数据,可是我看数据范围应该没问题才对