首先从终点向起点找,指向没找到的点的点不能走。
之后就是最短路径了
#include<bits/stdc++.h>
using namespace std;
int tot,total,n,m,q[500010],r[500010],w[500010],e[10010],kao[500010];
int que[10010],d[10010];
bool flag[10010],vis[10010],ha[10010];
void sf2(int u,int v) {
w[++tot]=e[u];
e[u]=tot;
kao[tot]=v;
}
void sf1(int x) {
int h=0,t=1;
que[1]=x;
vis[x]=1;
ha[x]=1;
total++;
while (h<t) {
int cur=que[++h];
for (int p=e[cur]; p; p=w[p]) {
int q=kao[p];
if (!vis[q]) {
vis[q]=1;
que[++t]=q;
total++;
ha[q]=1;
}
}
}
}
void sf(int x) {
int h=0,t=1;
que[1]=x;
memset(d,127,sizeof d);
d[x]=0;
while (h<t) {
int cur=que[++h];
vis[cur]=0;
for (int p=e[cur]; p; p=w[p]) {
int q=kao[p];
if (!ha[q]) continue;
if (flag[q]) continue;
if (d[q]>d[cur]+1) {
d[q]=d[cur]+1;
if (!vis[q]) {
vis[q]=1;
que[++t]=q;
}
}
}
}
}
int main() {
scanf("%d%d",&n,&m);
for (int z=1; z<=m; z++) scanf("%d%d",&q[z],&r[z]);
int st,ed;
scanf("%d%d",&st,&ed);
for (int z=1; z<=m; z++) sf2(r[z],q[z]);
sf1(ed);
if (!ha[st]) {
printf("%d",-1);
return 0;
}
for (int z=1; z<=n; z++) {
if (ha[z]) continue;
for (int p=e[z]; p; p=w[p]) {
int q=kao[p];
flag[q]=1;
}
}
memset(que,0,sizeof que);
memset(vis,0,sizeof vis);
memset(e,0,sizeof e);
tot=0;
for (int z=1; z<=m; z++) sf2(q[z],r[z]);
sf(st);
printf("%d",d[ed]);
return 0;
}