欢迎来到SFWR的博客

P2296 寻找道路

 

 

 

————————————————————————————————————————————————————————

// luogu-judger-enable-o2
// luogu-judger-enable-o2
#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
struct node{int nxt,to;}eg[200100];
int head[201000],ne,n,m,vist[200100],dis[201000],flag[200100],a,b,s,t;
void adde(int f,int v){eg[++ne].to=v;eg[ne].nxt=head[f];head[f]=ne;}
void spfa1(){
    queue<int> q;
    for(int i=1;i<=n;i++) dis[i]=INF; 
    q.push(t);dis[t]=0; vist[t]=1;
    while(!q.empty()){
    int u=q.front();
    q.pop();vist[u]=0;
    for(int i=head[u];i;i=eg[i].nxt)
        if(dis[eg[i].to]>dis[u]+1){
            dis[eg[i].to]=dis[u]+1;
            if(vist[eg[i].to]==0){vist[eg[i].to]=1;q.push(eg[i].to);}
        }   
    }
}
void spfa2(){
    queue<int> q;
    for(int i=1; i<=n; i++) dis[i]=INF; 
    q.push(t);dis[t]=0;vist[t]=1;
    while(!q.empty()){
    int u=q.front();
    q.pop();vist[u]=0;
    for(int i=head[u];i;i=eg[i].nxt)
        if(dis[eg[i].to]>dis[u]+1&&flag[eg[i].to]==0){
            dis[eg[i].to]=dis[u]+1;
            if(vist[eg[i].to]==0){vist[eg[i].to]=1;q.push(eg[i].to);}
        }   
    }
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {cin>>a>>b;if(a==b)continue;adde(b,a);}
    cin>>s>>t;
    spfa1();
    for(int i=1;i<=n;i++)
        if(dis[i]>=INF)
        for(int j=head[i];j;j=eg[j].nxt)flag[eg[j].to]=1;
    spfa2();
    if(dis[s]>=INF)cout<<-1;
    else
    cout<<dis[s];
}

 

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

posted @ 2019-06-01 21:55  SFWR  Views(89)  Comments(0Edit  收藏  举报