记录编号 450600 评测结果 AAAAAAAAAA
题目名称 [NOIP 2014]寻找道路 最终得分 100
用户昵称 GravatarHallmeow 是否通过 通过
代码语言 C++ 运行时间 0.090 s
提交时间 2017-09-16 16:37:54 内存使用 5.12 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<queue>
#define pos(i,a,b) for(int i=(a);i<=(b);i++)
#define pos2(i,a,b) for(int i=(a);i>=(b);i--)
#define N 20010
using namespace std;
int n,m,s,t;
struct haha{
	int next,to;
}edge[301000],edgefan[301000];
int head[N],headfan[N],cnt=1,cntfan=1;
void add(int u,int v){
	edge[cnt].to=v;edge[cnt].next=head[u];head[u]=cnt++;
}
void addfan(int u,int v){
	edgefan[cntfan].to=v;edgefan[cntfan].next=headfan[u];headfan[u]=cntfan++;
}
bool flag[N];
void bfs1(){
	queue<int> q;
	q.push(t);
	flag[t]=1;
	while(!q.empty()){
		int temp=q.front();q.pop();
		for(int i=headfan[temp];i;i=edgefan[i].next){
			int to=edgefan[i].to;
			if(flag[to]==0){
				flag[to]=1;
				q.push(to);
			}
		}
	}
}
struct xixi{
	int now,w;
};
int ans=-1;
bool cun[N],vis[N];
void bfs2(){
	queue<xixi> q;
	q.push((xixi){s,0});
	cun[s]=1;vis[s]=1;
	while(!q.empty()){
		xixi temp=q.front();q.pop();
		int now=temp.now,w=temp.w;
		for(int i=head[now];i;i=edge[i].next){
			int to=edge[i].to;
			if(to==t){
				ans=w+1;return;
			}
			if(cun[to]==1&&vis[to]==0){
				vis[to]=1;
				q.push((xixi){to,w+1});
			}
		}
	}
}
int main(){
	freopen("roadb.in","r",stdin);
	freopen("roadb.out","w",stdout);
	scanf("%d%d",&n,&m);
	pos(i,1,m){
		int x,y;scanf("%d%d",&x,&y);
		if(x==y) continue;
		add(x,y);addfan(y,x);
	}
	scanf("%d%d",&s,&t);
	bfs1();
	
	//system("pause");
	//flag[s]=flag[t]=1;
	pos(x,1,n){
		if(x!=s&&x!=t){
			int u=0;
			for(int i=head[x];i;i=edge[i].next){
				int to=edge[i].to;
				if(flag[to]==0){
					u=1;break;
				}
			}
			if(u==0){
				cun[x]=1;
			}
		}
	}//return 0;
	/*pos(i,1,n){
		cout<<"i="<<i<<"  cun="<<cun[i]<<endl;
	}*/
	bfs2();
	cout<<ans;
	return 0;
}