NOIP2014DAY2T2

#include<stdio.h>
#include<stdlib.h>
const int maxn=10010,maxm=200010;
int e,to[maxm],next[maxm],begin[maxn];
int e1,to1[maxm],next1[maxm],begin1[maxn];
int p[maxn],pd[maxn],px[maxn];
int q[maxn],d[maxn];
void add(int x,int y)
{
    to[++e]=y;
    next[e]=begin[x];
    begin[x]=e;   
}
void add1(int x,int y)
{
    to1[++e1]=y;
    next1[e1]=begin1[x];
    begin1[x]=e1;   
}
 
void dfs(int x){
    int i;
    px[x]=1;pd[x]=1;
    for(i=begin1[x];i;i=next1[i])
        if(!pd[to1[i]])
            dfs(to1[i]);
    return;
}
int main(){
    int i,j,k,m,n,x,y,s,t;
    scanf("%d%d",&n,&m);
    for(i=1;i<=m;i++){
        scanf("%d%d",&x,&y);
        add(x,y);
        add1(y,x);
    }
    scanf("%d%d",&s,&t);
    dfs(t);
    for(i=1;i<=n;i++)
        if(begin[i]==0)
            p[i]=1;
        else
        for(j=begin[i];j;j=next[j])
            if(!px[to[j]]){
                p[i]=1;
                break;
            }
    p[t]=0;        
    for(i=1;i<=n;i++)pd[i]=0;
    int f=0,l=1;
    q[1]=s;pd[s]=1;
    while(f<l){
        f++;       
        for(i=begin[q[f]];i;i=next[i])
            if(!pd[to[i]] && !p[to[i]]){
                q[++l]=to[i];
                d[l]=d[f]+1;
                pd[to[i]]=1;
                if(to[i]==t){
                    printf("%d\n",d[l]);
                    return 0;
                }
            }
     
    }
    printf("-1\n");    
    return 0;
}

posted @ 2014-12-02 21:21  cnyali  阅读(123)  评论(0编辑  收藏  举报