标签:
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