题目描述

在有向图 G 中,每条边的长度均为 1,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件:

路径上的所有点的出边所指向的点都直接或间接与终点连通。

在满足条件 1 的情况下使路径最短。

注意:图 G 中可能存在重边和自环,题目保证终点没有出边。

请你输出符合条件的路径的长度。

输入格式

第一行有两个用一个空格隔开的整数 n 和 m,表示图有 n 个点和 m 条边。

接下来的 m 行每行 2 个整数 x,y,之间用一个空格隔开,表示有一条边从点 x 指向点y。

最后一行有两个用一个空格隔开的整数 s, t,表示起点为 s,终点为 t。

输出格式

输出只有一行,包含一个整数,表示满足题目描述的最短路径的长度。如果这样的路径不存在,输出-1。


预处理所有可以走的点,直接跑最短路

#include<cstdio>
#include<iostream>
#include<queue>
using namespace std;
const int N=1e5+10,M=2e6+10;
int n,m,s,t;
int Next[M],head[N],go[M],tot;
inline void add(int u,int v){
Next[++tot]=head[u];head[u]=tot;go[tot]=v;
}
struct E{
int x,y;
}e[M];
bool v1[N],v2[N];
int fa[N];
int get(int x){
if(x==fa[x])return x;
else return fa[x]=get(fa[x]);
}
bool bfs(){
queue<int>q;
q.push(t);
v1[t]=1;
while(q.size()){
int x=q.front();
q.pop();
for(int i=head[x];i;i=Next[i]){
if(v1[go[i]])continue;
v1[go[i]]=1;
q.push(go[i]);
}
}
}
int d[N];
struct node{
int u,d;
bool operator <(const node& rhs)const{
return d>rhs.d;
}
};
void dj(){
for(int i=1;i<=n;i++)d[i]=1e9;
priority_queue<node>Q;
d[s]=0;
Q.push((node){s,0});
while(!Q.empty()){
node ch=Q.top();
Q.pop();
int u=ch.u;
int y=ch.d;
if(y!=d[u])continue;
for(int i=head[u];i;i=Next[i]){
int x=go[i];
if(v2[go[i]]&&d[u]+1<d[x]){
d[x]=d[u]+1;
Q.push((node){x,d[x]});
}
}
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)fa[i]=i;
for(int i=1,x,y;i<=m;i++){
scanf("%d%d",&x,&y);
if(x==y)continue;
int a=get(x);
int b=get(y);
if(a!=b)fa[a]=b;
e[i].x=x;e[i].y=y;
add(y,x);
}
cin>>s>>t;
if(get(s)!=get(t)){
cout<<-1<<endl;
return 0;
}
bfs(); for(int i=1;i<=n;i++)head[i]=0;
for(int i=1;i<=tot;i++)Next[i]=0;
tot=0;
for(int i=1;i<=m;i++)
add(e[i].x,e[i].y); for(int i=1;i<=n;i++){
bool op=1;
for(int e=head[i];e;e=Next[e]){
if(v1[go[e]]==0){
op=0;
break;
}
}
v2[i]=op;
}
dj();
cout<<d[t];
}

最新文章

  1. ABP(现代ASP.NET样板开发框架)系列之3、ABP分层架构
  2. Oracle数据库面试题【转载】
  3. mysql中IFIND_IN_SET和like的区别
  4. (原)Java初始化过程
  5. CodeMirror很好用
  6. Cracking the coding interview--Q1.5
  7. 设计模式 - 单例模式mysql数据库操作类
  8. 候选键(unique)
  9. java设计原则:16种原则
  10. 最小生成树详解 prim+ kruskal代码模板
  11. 1.QT中的容器QVector,QList,QSet,QMap,QQueue,QStack,QMultiMap,QSingleList等
  12. 排序算法入门之快速排序(java实现)
  13. RabbitMQ资料
  14. Babel学习小记
  15. redis 远程操作命令
  16. RPC服务超时排查思路
  17. 812. Largest Triangle Area
  18. 12_python_生成器
  19. [译]How To Use the Linux Auditing System on CentOS 7
  20. Fedora 20 安装搜狗拼音输入法

热门文章

  1. Docker变量的相关总结
  2. 控制UI界面
  3. 【Leetcode 做题学算法周刊】第三期
  4. linux 命令 | 常用命令导图(0)
  5. 怎么把CAT客户端的RootMessageId记录到每条日志中?
  6. BASH 编程之变量高级篇
  7. 一张图讲解最少机器搭建FastDFS高可用分布式集群安装说明
  8. JVM,JDK,JRE
  9. Vue躬行记(9)——Vuex
  10. Spring Bean的生命周期、后置处理器、定义继承