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
相关文章推荐
- bzoj 1412: [ZJOI2009]狼和羊的故事
- Palindrome 系列
- 谷歌人机大战与新时代的来临
- 工厂模式之小结与区别(6)
- 抽象工厂模式(5)
- 抽象工厂模式(4)
- leetcode@ [116/117] Populating Next Right Pointers in Each Node I & II (Tree, BFS)
- !getApplicationContext()和Activity.this区别
- 【Android】20.4 录音
- MarkDown的简介
- 【Android】20.3 拍照和视频录制
- python中一些常用的module小结
- Jquery Ajax 跨域之JSONP方式极简示例,服务端是.net的ashx
- [leetcode] 311. Sparse Matrix Multiplication 解题报告
- C++ Exceptinal 类之间的关系
- 看最强大脑中英PK小记
- [leetcode] 280. Wiggle Sort 解题报告
- 产品等级结构 与 产品族(3)
- 实现计时器的几种方式
- aapt 解析android apk