记录编号 450656 评测结果 AAAAAAAAAA
题目名称 [NOIP 2014]寻找道路 最终得分 100
用户昵称 Gravatar하루Kiev 是否通过 通过
代码语言 C++ 运行时间 0.205 s
提交时间 2017-09-16 17:08:44 内存使用 15.38 MiB
显示代码纯文本
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <stdio.h>
#include <queue>
#define maxn 200005
using namespace std;
int n,m,ai,bi,s,t;
struct node{int to,next;}e[maxn*2];
int zz,st[maxn];
void add(int x,int y){
	 e[++zz].to=y;
	 e[zz].next=st[x];
	 st[x]=zz;
}
struct node1{int to,next,id;}ee[maxn*2];
int zz1,st1[maxn];
void adf(int x,int y){
	 ee[++zz1].to=y;
	 ee[zz1].next=st1[x];
	 ee[zz1].id=zz1;
	 st1[x]=zz1;
}
int dfn[maxn],low[maxn],bl[maxn],tim,cnt,sta[maxn],top;
bool vis[maxn],flag[maxn],used[maxn];
int ru[maxn],che[maxn];
void dfs(int x){
	 for(int i=st1[x];i;i=ee[i].next){
	 	 if(used[ee[i].id]) continue;
	 	 int t=ee[i].to;
	 	 che[t]++;
	 	 used[ee[i].id]=1;
	 	 dfs(t);
	 }
}
int dis[maxn];
void spfa(int x){
	 memset(dis,0x3f,sizeof(dis));
     dis[x]=0;
     queue<int> q;
     q.push(x);
     vis[x]=1;
     while(!q.empty()){
     	   int k=q.front();
     	   for(int i=st[k];i;i=e[i].next){
     	   	   int t=e[i].to;
     	   	   if(!flag[t]) continue;
     	   	   if(dis[t]>dis[k]+1){
     	   	   	  dis[t]=dis[k]+1;
     	   	   	  if(!vis[t]){
     	   	   	  	 vis[t]=1;
     	   	   	  	 q.push(t);
     	   	   	  }
     	   	   }
     	   }
     	   q.pop();
     	   vis[k]=0;                    
     }
}
int main(){
	freopen("roadb.in","r",stdin);
	freopen("roadb.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++){
		scanf("%d%d",&ai,&bi);
		add(ai,bi);
		adf(bi,ai);
		ru[ai]++;
	}
	scanf("%d%d",&s,&t);
	
	dfs(t);
	for(int i=1;i<=n;i++)
		if(che[i]==ru[i]) flag[i]=1;
	spfa(s);
	if(dis[t]>99999) printf("-1");
	else printf("%d",dis[t]);
}
/*
7 15
2 4
4 6
7 5
5 1
2 3
4 3
6 3
6 2
5 7
2 4
6 7
7 6
2 4
6 7
5 6
7 1
*/