标签:
BZOJ 1415
1 #include <iostream> 2 #include <cstring> 3 #include <algorithm> 4 #include <cstdio> 5 using namespace std; 6 const int Maxn=1010; 7 int t[Maxn],n,m,S,T,now,p[Maxn][Maxn],head[Maxn],dis[Maxn],u,v,cnt; 8 double f[Maxn][Maxn]; 9 struct EDGE 10 { 11 int to,next; 12 }edge[Maxn<<2]; 13 inline void Add(int u,int v) 14 {edge[cnt].to=v;edge[cnt].next=head[u];head[u]=cnt++;} 15 void Dfs(int u,int top) 16 { 17 for (int i=head[u];i!=-1;i=edge[i].next) 18 if (dis[edge[i].to]==-1 || dis[edge[i].to]>dis[u]+1 || (dis[edge[i].to]==dis[u]+1 && p[now][edge[i].to]>top)) 19 { 20 dis[edge[i].to]=dis[u]+1; 21 p[now][edge[i].to]=top; 22 Dfs(edge[i].to,top); 23 } 24 } 25 double F(int S,int T) 26 { 27 if (f[S][T]!=0) return f[S][T]; 28 if (S==T) return 0; 29 if (p[p[S][T]][T]==T || p[S][T]==T) return 1; 30 double res=0; 31 for (int i=head[T];i!=-1;i=edge[i].next) 32 res+=F(p[p[S][T]][T],edge[i].to); 33 res+=F(p[p[S][T]][T],T); 34 res/=(double)(t[T]+1.0); 35 res+=1; 36 return f[S][T]=res; 37 } 38 int main() 39 { 40 scanf("%d%d",&n,&m); 41 scanf("%d%d",&S,&T); 42 memset(head,-1,sizeof(head)); 43 for (int i=1;i<=m;i++) 44 { 45 scanf("%d%d",&u,&v); 46 Add(u,v),Add(v,u); 47 t[u]++; t[v]++; 48 } 49 50 for (int i=1;i<=n;i++) 51 { 52 memset(dis,-1,sizeof(dis)); 53 dis[i]=0; 54 for (int j=head[i];j!=-1;j=edge[j].next) 55 { 56 now=i; 57 dis[edge[j].to]=1; 58 Dfs(edge[j].to,edge[j].to); 59 } 60 for (int j=head[i];j!=-1;j=edge[j].next) p[i][edge[j].to]=edge[j].to; 61 } 62 printf("%.3lf\n",F(S,T)); 63 return 0; 64 }
BZOJ 1419
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <algorithm> 5 using namespace std; 6 const int Maxn=5010; 7 double f[3][Maxn]; 8 int R,B,cur; 9 inline double Max(double x,double y) {return x>y?x:y;} 10 int main() 11 { 12 scanf("%d%d",&R,&B); 13 for (int i=1;i<=R;i++) 14 { 15 cur^=1; 16 for (int j=0;j<=B;j++) 17 { 18 if (i==0) {f[cur][j]=0; continue;} 19 if (j==0) {f[cur][j]=f[cur^1][j]+1;continue;} 20 f[cur][j]=Max(0,(f[cur^1][j]+1.0)*((double)(i)/(double)(i+j))+(f[cur][j-1]-1.0)*((double)(j)/(double)(i+j))); 21 22 } 23 } 24 printf("%.6lf\n",f[cur][B]-5e-7); 25 return 0; 26 }
算法合集之《浅析竞赛中一类数学期望问题的解决方法》中有对题目的讲解。
#include <iostream>#include <cstring>#include <algorithm>#include <cstdio>using namespace std;const int Maxn=1010;int t[Maxn],n,m,S,T,now,p[Maxn][Maxn],head[Maxn],dis[Maxn],u,v,cnt;double f[Maxn][Maxn];struct EDGE{ int to,next;}edge[Maxn<<2];inline void Add(int u,int v){edge[cnt].to=v;edge[cnt].next=head[u];head[u]=cnt++;}void Dfs(int u,int top){ for (int i=head[u];i!=-1;i=edge[i].next) if (dis[edge[i].to]==-1 || dis[edge[i].to]>dis[u]+1 || (dis[edge[i].to]==dis[u]+1 && p[now][edge[i].to]>top)) { dis[edge[i].to]=dis[u]+1; p[now][edge[i].to]=top; Dfs(edge[i].to,top); }}double F(int S,int T){ if (f[S][T]!=0) return f[S][T]; if (S==T) return 0; if (p[p[S][T]][T]==T || p[S][T]==T) return 1; double res=0; for (int i=head[T];i!=-1;i=edge[i].next) res+=F(p[p[S][T]][T],edge[i].to); res+=F(p[p[S][T]][T],T); res/=(double)(t[T]+1.0); res+=1; return f[S][T]=res;}int main(){ scanf("%d%d",&n,&m); scanf("%d%d",&S,&T); memset(head,-1,sizeof(head)); for (int i=1;i<=m;i++) { scanf("%d%d",&u,&v); Add(u,v),Add(v,u); t[u]++; t[v]++; } for (int i=1;i<=n;i++) { memset(dis,-1,sizeof(dis)); dis[i]=0; for (int j=head[i];j!=-1;j=edge[j].next) { now=i; dis[edge[j].to]=1; Dfs(edge[j].to,edge[j].to); } for (int j=head[i];j!=-1;j=edge[j].next) p[i][edge[j].to]=edge[j].to; } printf("%.3lf\n",F(S,T)); return 0;}标签:
原文地址:http://www.cnblogs.com/yyjxx2010xyu/p/5484111.html