1 #include <cstdio> 2 #include <vector> 3 #include <queue> 4 #include <algorithm> 5 #define maxn 1010 6 using namespace std; 7 8 9 int n, m, a, b; 10 vector<int> g[maxn]; 11 int s[maxn][maxn]; 12 double f[maxn][maxn]; 13 14 void bfs( int src ) { 15 queue<int> qu; 16 s[src][src] = src; 17 for( int t=0; t<g[src].size(); t++ ) { 18 int v = g[src][t]; 19 s[src][v] = v; 20 qu.push( v ); 21 } 22 while( !qu.empty() ) { 23 int u = qu.front(); 24 qu.pop(); 25 for( int t=0; t<g[u].size(); t++ ) { 26 int v = g[u][t]; 27 if( s[src][v] ) continue; 28 s[src][v] = s[src][u]; 29 qu.push(v); 30 } 31 } 32 } 33 void dodp( int i, int j ) { 34 double &dv = f[i][j]; 35 if( dv>-0.5 ) return; 36 if( i==j ) { 37 dv = 0.0; 38 return; 39 } 40 if( s[i][j]==j || s[s[i][j]][j]==j ) { 41 dv = 1.0; 42 return; 43 } 44 dv = 0.0; 45 for( int t=0; t<g[j].size(); t++ ) { 46 int v = g[j][t]; 47 dodp( s[s[i][j]][j], v ); 48 dv += f[s[s[i][j]][j]][v]; 49 } 50 dv /= g[j].size(); 51 dv += 1.0; 52 } 53 54 int main() { 55 scanf( "%d%d%d%d", &n, &m, &a, &b ); 56 for( int i=1,u,v; i<=m; i++ ) { 57 scanf( "%d%d", &u, &v ); 58 g[u].push_back(v); 59 g[v].push_back(u); 60 } 61 for( int i=1; i<=n; i++ ) sort( g[i].begin(), g[i].end() ); 62 for( int i=1; i<=n; i++ ) bfs(i); 63 for( int i=1; i<=n; i++ ) 64 g[i].push_back(i); 65 for( int i=1; i<=n; i++ ) 66 for( int j=1; j<=n; j++ ) f[i][j] = -1.0; 67 dodp( a, b ); 68 printf( "%.3lf ", f[a][b] ); 69 }