#include #include #include #define MAX 100 int N, V, T1, T2; int adj[MAX][MAX], nadj[MAX]; double mat[MAX][MAX]; double vec[MAX]; void init() { memset(nadj, 0, sizeof(nadj)); memset(mat, 0, sizeof(mat)); memset(vec, 0, sizeof(vec)); } 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[i][i] = 1.0; continue; } mat[i][i] = -1.0; for (p = 0; p < nadj[i]; p++) { j = adj[i][p]; mat[i][j] = 1.0 / nadj[i]; } } vec[T1] = 1.0; } void find_eigenvector() { int i, j; int r, p; for (r = 0; r < N; r++) { for (p = r; p < N; p++) { if (fabs(mat[p][r]) > 1e-10) { break; } } if (p == N) { continue; } for (j = 0; j < N; j++) { double t = mat[r][j]; mat[r][j] = mat[p][j]; mat[p][j] = t; } { double t = vec[r]; vec[r] = vec[p]; vec[p] = t; } for (i = r+1; i < N; i++) { double t = mat[i][r] / mat[r][r]; for (j = r; j < N; j++) { mat[i][j] -= t * mat[r][j]; } vec[i] -= t * vec[r]; } } for (r = N-1; r >= 0; r--) { double t = mat[r][r]; for (j = 0; j < N; j++) { mat[r][j] /= t; } vec[r] /= t; for (i = 0; i < r; i++) { double t = mat[i][r]; for (j = 0; j < N; j++) { mat[i][j] -= t * mat[r][j]; } vec[i] -= t * vec[r]; } } } int main() { while (scanf(" %d %d %d %d", &N, &V, &T1, &T2) != EOF) { V--; T1--; T2--; init(); read_graph(); gen_matrix(); find_eigenvector(); printf("%.6f\n", fabs(vec[V])); } return 0; }