bzoj 1415 无环期望

 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\n", f[a][b] );
69 }
View Code

 

posted @ 2015-02-25 18:30  idy002  阅读(198)  评论(0编辑  收藏  举报