两遍BFS,简单WA AC 注:第二遍改DFS会TLE 直接上代码
vector<int>t[10010]; vector<int>r[10010]; queue<int>q; int p[10010],n,b,e,g[10010],f[10010]; void add(int v,int u) { t[u].push_back(v); r[v].push_back(u); }//方便输入 bool check(int x) { fr(i,0,t[x].size()-1) if(!p[t[x][i]]) return 0; return p[x]; }//判断是否可以出现在路径中 int main(){ #ifndef ONLINE_JUDGE freopen("","r",stdin); freopen("","w",stdout); #endif n=read(); fr(i,1,read()) add(read(),read()); b=read(); e=read(); q.push(e); while(!q.empty()) { int d=q.front(); q.pop(); p[d]=1; fr(i,0,r[d].size()-1) if(!p[r[d][i]]) q.push(r[d][i]); }//直接找可以直接或间接到达终点的点 fr(i,1,n) g[i]=check(i); g[e]=1; if(!g[b]) { puts("-1"); return 0; } fr(i,1,n) f[i]=0; f[b]=1; q.push(b); while(!q.empty()) { int d=q.front(); q.pop(); fr(i,0,t[d].size()-1) if(g[t[d][i]]&&!f[t[d][i]]) { f[t[d][i]]=f[d]+1; q.push(t[d][i]); } }//寻找最短路径 printf("%d\n",f[e]-1); rt 0; }