Code:

#include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;
const int maxn = 200000 + 3;
int head[maxn<<1], to[maxn<<1], nex[maxn<<1], cnt;
int mark[maxn], du[maxn], vis[maxn],d[maxn],del[maxn];
queue<int>Q;
inline void add_edge(int u,int v)
{
nex[++cnt] = head[u], head[u] = cnt, to[cnt] = v;
}
inline void solve(int s)
{
Q.push(s);
mark[s] = 1;
while(!Q.empty())
{
int u = Q.front();Q.pop();
for(int v = head[u]; v ; v = nex[v])
if(!mark[to[v]])
{
mark[to[v]] = 1;
Q.push(to[v]);
}
}
}
int main()
{
//freopen("in.txt","r",stdin);
int n,m;
scanf("%d%d",&n,&m);
for(int i = 1;i <= m;++i)
{
int a,b;
scanf("%d%d",&a,&b);
add_edge(b,a);
du[a] = 1;
}
int s,t;
scanf("%d%d",&s,&t);
solve(t);
for(int i = 1;i <= n;++i)
{
if(!mark[i])
{
del[i] = 1;
for(int v = head[i]; v ; v = nex[v])
{
del[to[v]] = 1;
}
}
}
Q.push(t);
vis[t] = 1, d[s] = -1;
while(!Q.empty())
{
int u = Q.front();Q.pop();
for(int v = head[u]; v ; v = nex[v])
if(!vis[to[v]] && !del[to[v]])
{
vis[to[v]] = 1, d[to[v]] = d[u] + 1;
Q.push(to[v]);
}
if(vis[s]) break;
}
printf("%d",d[s]);
return 0;
}

最新文章

  1. Kafka基本原理
  2. php止刷新页面重复提交
  3. java任务调度quartz框架的小例子
  4. page object
  5. 通过 imagick 让 PHP 生成 PSD 文件缩略图
  6. offsetLeft与offsetTop详解
  7. instancetype、id、NSObject的联系和区别
  8. vs2013下git的使用
  9. xmlns:android作用以及自定义布局属性
  10. hackerrank:Almost sorted interval
  11. Head First C#(赛狗日)
  12. 安卓里面JSON处理和JAVA SE里面的JSON包
  13. Socket 心跳包机制总结
  14. [Android阅读代码]圆形旋转菜单CircleMenu
  15. 引用dll文件要复制到本地
  16. ngrx/store effects 使用总结1:计数器
  17. HttpService
  18. A.Ocean的礼物线段树
  19. C++调用外部应用程序
  20. [AWS] Deploy react project on EC2

热门文章

  1. Ubuntu 14.04远程登录服务器
  2. redis-windows上的安装与其他命令
  3. cogs 10. 信号无错传输
  4. 如何用arcgis进行WGS84的投影坐标变换
  5. Yarn的工作流程
  6. 【CSS】隐藏多行文本框Textarea在IE中的垂直滚动栏
  7. Java Word Break(单词拆解)
  8. Mina airQQ聊天开门见山篇(一)
  9. 关于ShapeDrawable应用的一些介绍(上)
  10. linux 免密登陆(超简单)