luogu 2296 寻找道路 简单BFS

简单的BFS,练习基础

#include<bits/stdc++.h>
#define rep(i,x,y) for(register int i=x;i<=y;i++)
#define dec(i,x,y) for(register int i=x;i>=y;i--)
#define LL long long
#define In freopen("7.in","r",stdin)
#define In2 freopen("8.in","r",stdin)
using namespace std;
const int N=1e4+50;
const int M=2e5+50;
inline int read(){
    int x=0,f=1;char ch=getchar();
    while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
    while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    return x*f;}

int n,m,s,t,deg[N];bool vis[N];
vector<int> tow[N],rev[N];

queue<int> q;
void pre(){
    n=read(),m=read();
    rep(i,1,m){
        int u=read(),v=read();
        tow[u].push_back(v);
        rev[v].push_back(u);
    }
    s=read(),t=read();
    q.push(t);
    while(!q.empty()){
        int u=q.front();q.pop();
        if(vis[u]) continue;vis[u]=1;
        for(int i=0;i<rev[u].size();i++){
            int v=rev[u][i];
            deg[v]++;q.push(v);
        }
    }    
}
int dis[N];
void work(){
    memset(vis,0,sizeof vis);
    memset(dis,0x3f,sizeof dis);
    dis[s]=0;q.push(s);
    while(!q.empty()){
        int u=q.front();q.pop();
        if(vis[u]) continue;vis[u]=1;
        if(deg[u]!=tow[u].size()) continue;
        for(int i=0;i<tow[u].size();i++){
            int v=tow[u][i];
            if(dis[v]>dis[u]+1){
                dis[v]=dis[u]+1;
                if(!vis[v]) q.push(v);
            }
        }
    }
}
int main(){
    pre(); work();
    if(dis[t]!=0x3f3f3f3f) printf("%d\n",dis[t]);
    else printf("-1\n");  return 0;
}

 

posted @ 2018-10-04 09:28  ASDIC减除  阅读(107)  评论(0编辑  收藏  举报