此题的判断条件挺有趣的
AC代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int mod = 1e9+7;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int T;
cin>>T;
while(T--){
int n,m;
cin>>n>>m;
int s , t;
cin>>s>>t;
s--;t--;
vector<vector<int>>v(n);
for(int i = 0; i < m;i++){
int a, b;
cin>>a>>b;
a--;
b--;
v[a].emplace_back(b);
v[b].emplace_back(a);
}
auto bfs=[&](int s){
queue<int>q;
vector<pair<int,ll>>dis(n);
q.push(s);
dis[s].second = 1;
while(!q.empty()){
int now = q.front();q.pop();
for(auto it : v[now]){
if(it == s)continue;
if(dis[it].first == 0){
dis[it].first = dis[now].first + 1;
q.push(it);
}
if(dis[it].first == dis[now].first + 1){
dis[it].second += dis[now].second;
dis[it].second %= mod;
}
}
}
return dis;
};
vector<pair<int,ll>>dis = bfs(s);
vector<pair<int,ll>>dit = bfs(t);
int len = dis[t].first;
ll ans = dis[t].second;
for(int i = 0 ;i < n ; i++){
for(auto it : v[i]){
if(dis[i].first + dit[it].first == len && dis[i].first == dis[it].first){
ans += (ll)dis[i].second * dit[it].second % mod;
ans %= mod;
}
}
}
cout<<ans<<'\n';
}
return 0;
}