记录编号 333616 评测结果 AAAAAAAAAA
题目名称 [NOIP 2014]寻找道路 最终得分 100
用户昵称 Gravatar安呐一条小咸鱼。 是否通过 通过
代码语言 C++ 运行时间 0.125 s
提交时间 2016-10-31 07:38:47 内存使用 3.46 MiB
显示代码纯文本
#include <cmath>
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

const int maxn = 10000 + 10 ;
const int maxm = 200000 + 10;

int read(){
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
}

struct Edge{
	int to,next;
}edge[maxm];
struct Node{
	int id,dis;
	Node(int a=0,int b=0){id=a,dis=b;}
	bool operator < (const Node & x )const 
	{ return dis > x.dis ;}
};
int tot,head[maxn];
void Addedge(int x,int y){
	edge[++tot].to=y;
	edge[tot].next=head[x];
	head[x]=tot;
}

int n,m,x[maxm],y[maxm],s,t,dis[maxn];
bool v[maxn],vis[maxn];
priority_queue<Node> q;
queue<int> Q;

void Bfs(){
	Q.push(t);
	while(!Q.empty())
	{
		int temp = Q.front(); Q.pop();
		if(vis[temp])continue;
		vis[temp]=1;
		for(int i=head[temp];i;i=edge[i].next){
			if(!vis[edge[i].to])Q.push(edge[i].to);
		}
	}
	for(int i=1;i<=n;i++){
		if(!vis[i]){
			v[i]=1;
			for(int j=head[i];j;j=edge[j].next){
				v[edge[j].to]=1;
			}
		}
	}
}

void Djs()
{	
	memset(dis,0x7f,sizeof(dis));
	dis[s]=0;q.push(Node(s,0));
	while(!q.empty()){
		Node u = q.top(); q.pop();
		if(v[u.id]||dis[u.id]!=u.dis)continue;
		for(int i=head[u.id];i;i=edge[i].next){
			if(!v[edge[i].to]&&dis[edge[i].to]>dis[u.id]+1){
				dis[edge[i].to]=dis[u.id]+1;
				q.push(Node(edge[i].to,dis[edge[i].to]));
			}
		}
	}
	if(dis[t] == 0x7f7f7f7f )dis[t]=-1;
	printf("%d\n",dis[t]);
}

int main(){
	freopen("roadb.in","r",stdin);
	freopen("roadb.out","w",stdout);
	n=read();m=read();
	for(int i=1;i<=m;i++){
		x[i]=read();y[i]=read();
		Addedge(y[i],x[i]);
	}
	s=read();t=read();
	Bfs();
	memset(edge,0,sizeof(edge)); memset(head,0,sizeof(head)); tot=0;
	for(int i=1;i<=m;i++)Addedge(x[i],y[i]);
	Djs();
	getchar();getchar();
}
/*
6 6
1 2
1 3
2 6
2 5
4 5
3 4
1 5

3 2
1 2
2 1
1 3
*/