蒟蒻梅石粒,思路是借鉴他人的(已标出)
#include<bits/stdc++.h>
using namespace std;
int const N = 2e5 + 5;
int n,m,s,t,cnt;
int head[N],nxt[N],to[N],dis[N];
bool vis[N];
inline int read(){
int x = 0;char c = getchar();
while(c < '0' || c > '9'){c = getchar();};
while(c >= '0' && c <= '9'){x = ((x << 1) + (x << 3) + (c ^ 48));c = getchar();}
return x;
}
inline void add(int a,int b){
nxt[++cnt] = head[a];
to[cnt] = b;
head[a] = cnt;
}
void bfs(){
queue<int> q;
dis[t] = 0;
vis[t] = true;
q.push(t);
while(!q.empty()){
int id = q.front();
q.pop();
int d = dis[id] + 1;
for(int i = head[id]; i; i = nxt[i]){
int v = to[i];
if(dis[v] > d && !vis[v]){
dis[v] = d;
vis[v] = true;
q.push(v);
}
}
}
}
void solve(){
n = read();m = read();s = read();t = read();
cnt = 0;
memset(vis,0,n + 3);
memset(head,0,4 * n + 3);
memset(dis,0x3f,4 * n + 3);
for(int i = 1,u,v; i <= m; i++){
u = read();v = read();
if(u == v){
continue;
}
add(u,v);
add(v,u);
}
bfs();
int ans = 1e9;
for(int i = 0,um; i < n; i++){
um = dis[i];
if(i > s){
um += i;
}
else if(i < s){
um += i + 1;
}
ans = min(ans,um);
}
printf("%d\n",ans);
}
int main(){
int T;
scanf("%d",&T);
while(T--){
solve();
}
return 0;
}
QAQ