NOIP2014 day2 T2寻找道路

#include<iostream>
#include<cmath>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<vector>
#include<deque>
#include<queue>
#include<stack>
using namespace std;
bool flag;
int cnt,cntt,minn=9999999;
int vis[10005],dis[10005],inq[10005];
vector<int>v[10005],fa[10005];
queue<int>q;
void pre(int x){//预处理,删去不符合条件的点。 
     for(int i = 0;i < fa[x].size();i++)
        vis[fa[x][i]] = 1;
}
void spfa(int a){
    memset(dis,127,sizeof(dis));//距离数组初始化最大; 
    int s;
    q.push(a);
    dis[a] = 0;
    inq[a] = 1;//判断是否在队列中 
    while(!q.empty()){
        s = q.front();q.pop();//取队首。 
        for(int i = 0;i < v[s].size();i++){
            if(!vis[v[s][i]]&&dis[s]+1<dis[v[s][i]]){//目标节点合法,且距离更短, 
                dis[v[s][i]] = dis[s]+1;//更新这个点; 
               if(!inq[v[s][i]])
               q.push(v[s][i]),inq[v[s][i]]=1;//把这个点加入队列。 
            }
        }
        inq[s] = 0;
    }
}
int main(){
    int n,m,a,b;
    freopen("road.in","r",stdin);
    freopen("road.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i = 1;i <= m;i++){
        scanf("%d%d",&a,&b);
        v[a].push_back(b);
        fa[b].push_back(a);
    } 
    scanf("%d%d",&a,&b);
    if(!fa[b].size()){
        printf("-1
");
        return 0;
    }
    for(int i = 1;i <= n;i++)
       if(!v[i].size()&&i!=b)
          pre(i);//对没有出边的节点进行预处理; 
    spfa(a);
    if(dis[b]==dis[0])
       printf("-1
");
    else printf("%d
",dis[b]);
    return 0;
}
原文地址:https://www.cnblogs.com/syx-799/p/5782853.html