1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<queue>
 6 #define pa pair<int,int>
 7 #define M 1008
 8 #define inf 100000000
 9 using namespace std;
10 int cnt,mark[M][M],b[M],dis[M][M],n,m,head[M],next[M*M],u[M*M],s,t;
11 double f[M][M];
12 void jia(int a1,int a2)
13 {
14     cnt++;
15     next[cnt]=head[a1];
16     head[a1]=cnt;
17     u[cnt]=a2;
18     return;
19 }
20 int zou(int s,int t)
21 {
22     int k=inf,k1=-1;
23     for(int i=head[s];i;i=next[i])
24       if(k>dis[u[i]][t]||(k==dis[u[i]][t]&&k1>u[i]))
25         {
26             k=dis[u[i]][t];
27             k1=u[i];
28         }
29     return k1;
30 }
31 double zhao(int s,int t)
32 {
33     int tot=1,s1=s;
34     double q=0;
35     if(mark[s][t])
36       return f[s][t];
37     if(s==t)
38       return 0;
39     for(int i=1;i<3;i++)
40       {
41         s=zou(s,t);
42         if(s==t)
43           {
44             f[s1][t]=1;
45             return f[s1][t];
46           }
47       }
48     q+=zhao(s,t);
49     for(int i=head[t];i;i=next[i]) 
50       {
51         q+=zhao(s,u[i]);
52         tot++;
53       }
54     mark[s1][t]=1;
55     f[s1][t]=q/(1.0*tot)+1;
56     return f[s1][t];
57 }
58 int main()
59 {
60     scanf("%d%d%d%d",&n,&m,&s,&t);
61     for(int i=1;i<=m;i++)
62       {
63         int a1,a2;
64         scanf("%d%d",&a1,&a2);
65         jia(a1,a2);
66         jia(a2,a1);
67       }
68     for(int i=1;i<=n;i++)
69       {
70         for(int j=1;j<=n;j++)
71           dis[i][j]=inf;
72         dis[i][i]=0;
73         memset(b,0,sizeof(b));
74         priority_queue<pa,vector<pa>,greater<pa> >q;
75         q.push(make_pair(0,i));
76         for(;!q.empty();)
77           {
78                 int p=q.top().second;
79                 q.pop();
80                 if(b[p])
81                   continue;
82                 b[p]=1;
83                 for(int j=head[p];j;j=next[j])
84                   if(dis[i][u[j]]>dis[i][p]+1)
85                     {
86                         dis[i][u[j]]=dis[i][p]+1;
87                         q.push(make_pair(dis[i][u[j]],u[j]));
88                     }
89           }   
90       }
91     printf("%.3lf",zhao(s,t));
92     return 0;
93 }

概率性dp,但首先要用nlogn的dj预处理出两点之间的距离,然后就是一个简单的概率性dp

posted on 2016-03-13 05:41  xiyuedong  阅读(161)  评论(0编辑  收藏  举报