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