1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
| #include<bits/stdc++.h> #define inf 0x3f3f3f3f
using namespace std;
int dp[1000001],n,m,t[1000001],tt[1000001],S,T; bool vis[1000001]; int cnt1,cnt2; class graph {public: int to,nxt; }edge[2000010],egde[2000010];
int l,r; int que[2000010];
#define emp (l>r) #define L que[l] #define pop vis[que[l++]]=0 #define pl(x) vis[x]=1,que[--l]=x #define pr(x) vis[x]=1,que[++r]=x #define to1 edge[i].to #define to2 egde[i].to
inline void add(int v,int u) { edge[++cnt1].to=u; edge[cnt1].nxt=t[v]; t[v]=cnt1; }
inline void Add(int v,int u) { egde[++cnt2].to=u; egde[cnt2].nxt=tt[v]; tt[v]=cnt2;
}
int main() { #ifdef usm freopen("input.in","r",stdin); freopen("output.out","w",stdout); #endif scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { int u,v; scanf("%d%d",&u,&v); add(u,v); Add(v,u); } scanf("%d%d",&S,&T); memset(dp,0x3f,sizeof(dp)); l=1000001,r=1000000; dp[T]=0; que[++r]=T; while(!emp) { int _=L; pop; int mx=0; for(int i=t[_];i;i=edge[i].nxt)if(dp[to1]>mx) mx=dp[to1]; if(dp[_]>mx) { dp[_]=mx; if(!vis[_])pl(_); continue; } for(int i=tt[_];i;i=egde[i].nxt) if(dp[_]+1<dp[to2]) { dp[to2]=dp[_]+1; if(!vis[to2]) pr(to2); } } if(dp[S]!=inf)printf("%d",dp[S]); else puts("-1"); return 0; }
|