目前是WA了#4#8
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int NMAX=1000+10;
int edge[NMAX<<1],ecnt=0,fir[NMAX],nex[NMAX<<1];
int cnt[NMAX];
int go[NMAX][NMAX];
int flag[NMAX];
double mem[NMAX][NMAX];
struct node{
int x,deep,pre;
};
struct cmp{
bool operator()(node a,node b){
return a.deep==b.deep ? a.pre>b.pre : a.deep>b.deep;
}
};
void build(int u,int v){
edge[ecnt]=v;
nex[ecnt]=fir[u];
fir[u]=ecnt++;
cnt[u]++;
}
double dfs(int c,int m){
if (c==m) return 0;
if (go[c][m]==m || go[go[c][m]][m]==m) return 1;
if (mem[c][m]!=-1) return mem[c][m];
double res=dfs(go[go[c][m]][m],m);
for (int i=fir[m];i!=-1;i=nex[i]){
res+=dfs(go[go[c][m]][m],edge[i]);
}
return mem[c][m]=res/(1.0+cnt[m])+1;
}
int main(){
memset(fir,-1,sizeof(fir));
int n,e,c,m;
scanf("%d%d%d%d",&n,&e,&c,&m);
for (int i=0,a,b;i<e;i++){
scanf("%d%d",&a,&b);
build(a,b);
build(b,a);
}
for (int i=1;i<=n;i++){
memset(flag,0,sizeof(flag));
priority_queue<node,vector<node>,cmp> q;
q.push({i,1,1});
go[i][i]=i;
flag[i]=1;
while (!q.empty()){
node head=q.top();
q.pop();
for (int j=fir[head.x];j!=-1;j=nex[j]){
if (flag[edge[j]]) continue;
q.push({edge[j],head.deep+1,head.x});
go[edge[j]][i]=head.x;
flag[edge[j]]=head.deep+1;
}
}
}
for (int i=1;i<=n;i++){
for (int j=1;j<=n;j++){
mem[i][j]=-1;
}
}
printf("%.3lf\n",dfs(c,m));
return 0;
}