#include #include #define MAX 100 int N, V, T1, T2; int adj[MAX][MAX], nadj[MAX]; int cur; double mat[2][MAX][MAX]; void init() { memset(nadj, 0, sizeof(nadj)); cur = 0; memset(mat[cur], 0, sizeof(mat[cur])); } void read_graph() { int i; int X, Y; for (i = 0; i < N-1; i++) { scanf(" %d %d", &X, &Y); X--; Y--; adj[X][nadj[X]++] = Y; adj[Y][nadj[Y]++] = X; } } void gen_matrix() { int i, p, j; for (i = 0; i < N; i++) { if (i == T1 || i == T2) { mat[cur][i][i] = 1.0; } for (p = 0; p < nadj[i]; p++) { j = adj[i][p]; if (j == T1 || j == T2) { continue; } mat[cur][i][j] = 1.0 / nadj[j]; } } } void sqr_matrix() { int i, j, k; memset(mat[!cur], 0, sizeof(mat[!cur])); for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { for (k = 0; k < N; k++) { mat[!cur][i][j] += mat[cur][i][k] * mat[cur][k][j]; } } } cur = !cur; } int main() { int s; while (scanf(" %d %d %d %d", &N, &V, &T1, &T2) != EOF) { V--; T1--; T2--; init(); read_graph(); gen_matrix(); for (s = 0; s < 100; s++) { sqr_matrix(); } printf("%.6f\n", fabs(mat[cur][T1][V])); } return 0; }