您的位置:首页 > 其它

bzoj 1415: [Noi2005]聪聪和可可

2016-03-13 05:41 309 查看
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#define pa pair<int,int>
#define M 1008
#define inf 100000000
using namespace std;
int cnt,mark[M][M],b[M],dis[M][M],n,m,head[M],next[M*M],u[M*M],s,t;
double f[M][M];
void jia(int a1,int a2)
{
cnt++;
next[cnt]=head[a1];
head[a1]=cnt;
u[cnt]=a2;
return;
}
int zou(int s,int t)
{
int k=inf,k1=-1;
for(int i=head[s];i;i=next[i])
if(k>dis[u[i]][t]||(k==dis[u[i]][t]&&k1>u[i]))
{
k=dis[u[i]][t];
k1=u[i];
}
return k1;
}
double zhao(int s,int t)
{
int tot=1,s1=s;
double q=0;
if(mark[s][t])
return f[s][t];
if(s==t)
return 0;
for(int i=1;i<3;i++)
{
s=zou(s,t);
if(s==t)
{
f[s1][t]=1;
return f[s1][t];
}
}
q+=zhao(s,t);
for(int i=head[t];i;i=next[i])
{
q+=zhao(s,u[i]);
tot++;
}
mark[s1][t]=1;
f[s1][t]=q/(1.0*tot)+1;
return f[s1][t];
}
int main()
{
scanf("%d%d%d%d",&n,&m,&s,&t);
for(int i=1;i<=m;i++)
{
int a1,a2;
scanf("%d%d",&a1,&a2);
jia(a1,a2);
jia(a2,a1);
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
dis[i][j]=inf;
dis[i][i]=0;
memset(b,0,sizeof(b));
priority_queue<pa,vector<pa>,greater<pa> >q;
q.push(make_pair(0,i));
for(;!q.empty();)
{
int p=q.top().second;
q.pop();
if(b[p])
continue;
b[p]=1;
for(int j=head[p];j;j=next[j])
if(dis[i][u[j]]>dis[i][p]+1)
{
dis[i][u[j]]=dis[i][p]+1;
q.push(make_pair(dis[i][u[j]],u[j]));
}
}
}
printf("%.3lf",zhao(s,t));
return 0;
}


概率性dp,但首先要用nlogn的dj预处理出两点之间的距离,然后就是一个简单的概率性dp
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: