博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[BZOJ 3143][Hnoi2013]游走(高斯消元+期望)
阅读量:7143 次
发布时间:2019-06-29

本文共 1481 字,大约阅读时间需要 4 分钟。

Description

一个无向连通图,顶点从1编号到N,边从1编号到M。

小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获得等于这条边的编号的分数。当小Z 到达N号顶点时游走结束,总分为所有获得的分数之和。
现在,请你对这M条边进行编号,使得小Z获得的总分的期望值最小。

Solution

对于点u(u≠1):到达u的概率 f[u]=∑f[v]/d[v] (Edges(u,v))

而f[1]=∑f[v]/d[v]+1 (Edges(1,v))

高斯消元可以求出所有点的概率

对于每条边 到达边i的概率 p[i]=f[u]/d[u]+f[v]/d[v]

贪心的编号然后求出期望就好了

好像BZOJ上的数据会比较水,洛谷数据…卡精度

#include
#include
#include
#include
#include
#include
#define eps 1e-7using namespace std;int n,m,head[505],cnt=0,d[505];double a[505][505],f[505],p[250005];struct Node{ int next,from,to;}Edges[500005];void addedge(int u,int v){ Edges[++cnt].next=head[u]; head[u]=cnt; Edges[cnt].from=u; Edges[cnt].to=v;}void Gauss(){ for(int i=1;i<=n;i++) { int maxline=i; for(int j=i+1;j<=n;j++) if(a[j][i]>a[maxline][i])maxline=j; if(maxline!=i) for(int j=i;j<=n+1;j++) swap(a[maxline][j],a[i][j]); for(int j=i+1;j<=n;j++) { if(fabs(a[j][i])
0;i--) { for(int j=n;j>i;j--) a[i][n+1]-=f[j]*a[i][j]; f[i]=a[i][n+1]/a[i][i]; }}int main(){ memset(head,-1,sizeof(head)); scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { int u,v; scanf("%d%d",&u,&v); addedge(u,v); addedge(v,u); d[u]++,d[v]++; } for(int i=1;i
>1]+=(double)f[u]/d[u]; p[(i+1)>>1]+=(double)f[v]/d[v]; } sort(p+1,p+1+m); double ans=0; for(int i=1;i<=m;i++) ans+=p[i]*(m-i+1); printf("%.3lf\n",ans); return 0;}

 

被卡精度)

 

转载于:https://www.cnblogs.com/Zars19/p/6819037.html

你可能感兴趣的文章
grep过滤的详细说明和实例
查看>>
gradle 全局仓库
查看>>
sublime常用快捷键
查看>>
高新诚聘JAVA /.NET/APP测试/PHP开发
查看>>
计算文章字数
查看>>
局域网出现广播风暴怎么办?如何阻止广播风暴?
查看>>
windows对象属性总结
查看>>
springboot xml声明式事务管理方案
查看>>
Oracle各种空间大小及占用大小
查看>>
linux理解
查看>>
智能合约语言 Solidity 教程系列10 - 完全理解函数修改器
查看>>
nginx负载均衡,ssl原理,生成ssl秘钥对,nginx配置ssl
查看>>
如何学习c语言,新手入门应该注意什么?
查看>>
Git命令集之十——文件移动命令
查看>>
产业融合促使未来进入一个新的商业模式中去
查看>>
关于设置http响应头connection的作用
查看>>
GCC的几个重要选项解释
查看>>
Java之注解
查看>>
PHP响应式VIP电影影视系统源码 带自动采集和会员管理系统
查看>>
iframe里弹出的层显示在整个网页上
查看>>