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; }