1807. [NOIP2014]寻找道路
★☆ 输入文件:roadb.in
输出文件:roadb.out
简单对比
时间限制:1 s 内存限制:128 MB
【题目描述】
正反存两个图,预处理出不能走得点:
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<string> #include<queue> #include<cmath> #include<vector> using namespace std; const int N=10005; const int Maxn=99999999; int head[N],head_2[N]; int dis[N]; bool vis[N],visit[N]; int now=1,now_2=1; int n,m,start,endd; struct node{ int u,v,w,nxt; }E[N*20]; struct Node{ int u,v,w,nxt; }EE[N*20]; queue<int>q; inline int read() { int x=0,f=1;char c=getchar(); while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar(); return x*f; } inline void add(int u,int v) { E[now].v=v; E[now].w=1; E[now].nxt=head[u]; head[u]=now++; } inline void add_2(int u,int v) { EE[now_2].v=v; EE[now_2].w=1; EE[now_2].nxt=head_2[u]; head_2[u]=now_2++; } inline void spfa_1(int start) { for(int i=1;i<=n;i++) dis[i]=Maxn; dis[start]=0; vis[start]=1; q.push(start); while(!q.empty()) { int top=q.front(); q.pop(); vis[top]=0; for(int i=head_2[top];~i;i=EE[i].nxt) if(dis[EE[i].v]==Maxn) { dis[EE[i].v]=dis[top]+EE[i].w; if(!vis[EE[i].v]) vis[EE[i].v]=1, q.push(EE[i].v); } } for(int i=1;i<=n;i++) if(dis[i]==Maxn) for(int j=head_2[i];~j;j=EE[j].nxt) visit[EE[j].v]=1; } inline void spfa_2(int start) { for(int i=1;i<=n;i++) dis[i]=Maxn; dis[start]=0; vis[start]=1; q.push(start); while(!q.empty()) { int top=q.front(); q.pop(); vis[top]=0; for(int i=head[top];~i;i=E[i].nxt) if(dis[E[i].v]>dis[top]+E[i].w&&!visit[E[i].v]) { dis[E[i].v]=dis[top]+E[i].w; if(!vis[E[i].v]) vis[E[i].v]=1, q.push(E[i].v); } } if(dis[endd]==Maxn) printf("-1"); else printf("%d",dis[endd]); } int main() { freopen("roadb.in","r",stdin); freopen("roadb.out","w",stdout); n=read(),m=read(); for(int i=1;i<=n;i++) head[i]=head_2[i]=-1; for(int i=1;i<=m;i++) { int u=read(),v=read(); add(u,v); add_2(v,u); } start=read(),endd=read(); spfa_1(endd); spfa_2(start); return 0; }