数据显然出水了
评测记录:https://www.luogu.com.cn/record/124993462
#include<bits/stdc++.h>
using namespace std;
#define lowbit(x) (x&-x)
#define fir first
#define sec second
#define ls u<<1
#define rs u<<1|1
#define mid l+r>>1
namespace fastio {
#if defined(fre)
void fropen(string s){freopen((s+".in").c_str(),"r",stdin);freopen((s+".out").c_str(),"w",stdout);};void frclose(){fclose(stdin);fclose(stdout);}
#endif
template<typename T>inline void _read(T &x) {char t=getchar();bool tmp=0;x=0;while(t<'0'||t>'9'){if(t=='-')tmp=1;t=getchar();};while('0'<=t&&t<='9'){x=(x<<1)+(x<<3)+(t^48);t=getchar();}if(tmp)x=-x;}
void read(){}template<typename T,typename ...T2>inline void read(T &x,T2 &...oth) {_read(x);read(oth...);}
template<typename T>inline void read(T *l,T *r) {T *cur=l;while(cur!=r){_read(*cur);++cur;}}
template<typename T,typename T2>inline void read(T *l,T *r,T2 *l2,T2 *r2) {T *cur=l;T2 *cur2=l2;while(cur!=r){_read(*cur),_read(*cur2);++cur,++cur2;}}
template<typename T,typename T2,typename T3>inline void read(T *l,T *r,T2 *l2,T2 *r2,T3 *l3,T3 *r3) {T *cur=l;T2 *cur2=l2;T3 *cur3=l3;while(cur!=r){_read(*cur),_read(*cur2),_read(*cur3);++cur,++cur2,++cur3;}}
template<typename T>inline void _write(T x) {if(x<0){putchar('-');x=-x;}if(x/10)_write(x/10);putchar((x%10)^48);}
void write(){putchar('\n');}template<typename T,typename ...T2>inline void write(T x,T2 ...oth) {_write(x);write(oth...);}
template<typename T>inline void write(T *l,T *r) {T *cur=l;while(cur!=r){_write(*cur);putchar(' ');++cur;}putchar('\n');}}
using namespace fastio;
struct node {
int x;
int step;
int y;
};
//queue<node>que;
node a[50000007];
int cur=0,cnt=0;
//int head,tair;
vector<int>vec[5000006];
const int INF=201000318;
int vis[5000006];
int spfa[5000006];
int dijkstra[5000006];
int num=0;
int main() {
int n,m,s,t;
read(n,m);
while(m--) {
int x,y;read(x,y);
vec[x].push_back(y);
vec[y].push_back(x);
}
read(s,t);
cur=cnt=0;
a[cnt++]={t,0,0};
// que.push({t,0,0});
for(int i=0;i<=n;i++) {
spfa[i]=INF;
dijkstra[i]=INF;
}
while(cur!=cnt) {
node tmp=a[cur++];
int x=tmp.x;
int step=tmp.step;
// que.pop();
if(x==s)continue;
if(spfa[x]^INF)continue;
spfa[x]=step;
for(auto i:vec[x]) {
if(spfa[i]==INF)
a[cnt++]={i,step+1,0};
// que.push({i,step+1,0});
}
}
cur=cnt=0;
a[cnt++]={s,0,0};
// que.push({s,0,0});
while(cur!=cnt) {
node tmp=a[cur++];
int x=tmp.x;
int step=tmp.step;
// que.pop();
if(spfa[x]<=step)continue;
if(dijkstra[x]^INF)continue;
dijkstra[x]=step;
for(auto i:vec[x]) {
if(dijkstra[i]==INF&&spfa[i]>step)
a[cnt++]={i,step+1,0};
// que.push({i,step+1,0});
}
}
cur=cnt=0;
a[cnt++]={s,0,INF};
// que.push({s,0,INF});
while(cur!=cnt) {
node tmp=a[cur++];
int x=tmp.x;
int step=tmp.step;
int y=tmp.y;
// que.pop();
if(vis[x])continue;
if(step*2>=y)continue;
y=min(y,spfa[x]+dijkstra[x]);
vis[x]=1;
num++;
for(auto i:vec[x]) {
if(!vis[i])
a[cnt++]={i,step+1,y};
// que.push({i,step+1,y});
}
}
write(num-1);
return 0;
}