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

本文共 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

你可能感兴趣的文章
分配内存对齐的内存空间
查看>>
Android中ListView.getCount()与ListView.getChildCo...
查看>>
UVa 195-Anagram
查看>>
linux批量修改文件名大小写
查看>>
pyspark访问hive数据实战
查看>>
偶的第一个IOS Demo
查看>>
常见内部排序总结
查看>>
repo original
查看>>
文本处理三剑客之sed命令用法
查看>>
我的友情链接
查看>>
CSS预处理器-Sass
查看>>
mysql主主同步+Keepalived
查看>>
F5 负载均衡学习笔记----V9.x启动U盘制作方法
查看>>
PageRank MATLAB 实现
查看>>
不能盲目选择视频会议系统
查看>>
如何学编程
查看>>
学习Linux决心书
查看>>
javascript中函数的参数与arguments关系
查看>>
MySql函数大全<->
查看>>
头像裁剪
查看>>