#include #include #include #include #include #include #include #include #include #include using namespace std; //freopen("E:\\ipt.txt", "r", stdin); #define INF 0x3f3f3f3f #define uLL unsigned long long #define LL long long #define mxn 1000005 #define mxe 2500005 int cost[mxn], fst[mxn], nxt[mxe], from[mxn], to[mxe], sz; int rt[mxn]; bool isrt[mxn]; int find(int x){ if(rt[x]==x) return x; return rt[x]=find(rt[x]); } void insert(int x, int y){ nxt[sz]=fst[x], to[sz]=y, fst[x]=sz++; } int N, a, b, M; int dis[mxn], vis[mxn]; //int spfa(int st, int ed){ // memset(dis, 0x3f, sizeof(dis)); // queue que; // dis[st]=0, que.push(st), vis[st]=1; // while(!que.empty()){ // int u=que.front(); que.pop(); vis[u]=0; // for(int cur=fst[u]; cur!=-1; cur=nxt[cur]){ // int v=to[cur]; // if(dis[v]>dis[u]+1){ // dis[v]=dis[u]+1; // if(!vis[v]) que.push(v), vis[v]=1; // } // } // } // return dis[ed]; //} struct node{ int id, deep; node(){}; node(int x, int y):id(x), deep(y){} }; set mp; int bfs_(int st, int ed){ memset(vis, 0, sizeof(vis)); queue que; que.push(node(st, 0)), vis[st]=1; while(!que.empty()){ int u=que.front().id, d=que.front().deep; que.pop(); for(int cur=fst[u]; cur!=-1; cur=nxt[cur]){ int v=to[cur]; if(!vis[v]){ if(v==ed) return d+1; vis[v]=1; que.push(node(v, d+1)); } } } return INF; } int bfs(int st, int ed){ memset(vis, 0, sizeof(vis)); queue que; que.push(node(st, 0)), vis[st]=1; while(!que.empty()){ int u=que.front().id, d=que.front().deep; que.pop(); for(int i=1; i<=N; ++i) if(!vis[i] && !mp.count(uLL(INF)*u+i)){ if(i==ed) return d+1; vis[i]=1; que.push(node(i, d+1)); } } return INF; } int main(){ //freopen("E:\\ipt.txt", "r", stdin); while(cin>>N>>M>>a>>b){ memset(fst, -1, sizeof(fst)), sz=0; mp.clear(); for(int i=0; i