NOIP2014 day2 T2寻找道路

时间:2023-03-10 04:00:42
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=;
int vis[],dis[],inq[];
vector<int>v[],fa[];
queue<int>q;
void pre(int x){//预处理,删去不符合条件的点。
for(int i = ;i < fa[x].size();i++)
vis[fa[x][i]] = ;
}
void spfa(int a){
memset(dis,,sizeof(dis));//距离数组初始化最大;
int s;
q.push(a);
dis[a] = ;
inq[a] = ;//判断是否在队列中
while(!q.empty()){
s = q.front();q.pop();//取队首。
for(int i = ;i < v[s].size();i++){
if(!vis[v[s][i]]&&dis[s]+<dis[v[s][i]]){//目标节点合法,且距离更短,
dis[v[s][i]] = dis[s]+;//更新这个点;
if(!inq[v[s][i]])
q.push(v[s][i]),inq[v[s][i]]=;//把这个点加入队列。
}
}
inq[s] = ;
}
}
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 = ;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\n");
return ;
}
for(int i = ;i <= n;i++)
if(!v[i].size()&&i!=b)
pre(i);//对没有出边的节点进行预处理;
spfa(a);
if(dis[b]==dis[])
printf("-1\n");
else printf("%d\n",dis[b]);
return ;
}