【BZOJ3143】[Hnoi2013]游走 期望DP+高斯消元
【BZOJ3143】[Hnoi2013]游走
Description
一个无向连通图,顶点从1编号到N,边从1编号到M。
小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获得等于这条边的编号的分数。当小Z 到达N号顶点时游走结束,总分为所有获得的分数之和。
现在,请你对这M条边进行编号,使得小Z获得的总分的期望值最小。
Input
第一行是正整数N和M,分别表示该图的顶点数 和边数,接下来M行每行是整数u,v(1≤u,v≤N),表示顶点u与顶点v之间存在一条边。 输入保证30%的数据满足N≤10,100%的数据满足2≤N≤500且是一个无向简单连通图。
Output
仅包含一个实数,表示最小的期望值,保留3位小数。
Sample Input
2 3
1 2
1 3
Sample Output
HINT
题解:一个清晰的思路:我们如果能求出每条边期望被经过的次数,然后排个序,让期望次数越大的边的编号越小就行了。但是问题来了,点数500,边数?????,以边为变量跑高斯消元显然会TLE,那么我们只能以点为变量跑高斯消元。那么如何用点的期望表示边的期望呢?其实很简单,设边(a,b),点a的期望被经过次数是f[a],点b的是f[b],a的度数是d[a],b的是d[b],那么这条边的期望被经过次数显然是${f[a]\over d[a]}+{f[b]\over d[b]}$。
然后就是老办法了,如果存在边(a,b),那就f[a]+=f[b]/d[b],处理出来再移项即可,直接上高斯消元。
别忘了f[n]=1,f[1]要+1(因为是起始点)
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long double ld;
int n,m;
int pa[130000],pb[130000],d[510];
ld pc[130000],v[510][510],ans;
void add(int a,int b)
{
if(a==n) return ;
v[b][a]-=(ld)1/d[a];
}
int main()
{
scanf("%d%d",&n,&m);
int i,j,k;
for(i=1;i<=m;i++) scanf("%d%d",&pa[i],&pb[i]),d[pa[i]]++,d[pb[i]]++;
for(i=1;i<=m;i++) add(pa[i],pb[i]),add(pb[i],pa[i]);
for(i=1;i<=n;i++) v[i][i]+=1;
for(i=1;i<=n+1;i++) v[n][i]=0;
v[n][n]=v[n][n+1]=1,v[1][n+1]+=1;
for(i=1;i<=n;i++)
{
for(j=i+1;j<=n;j++) if(fabs(v[j][i])>fabs(v[i][i])) for(k=i;k<=n+1;k++) swap(v[i][k],v[j][k]);
if(fabs(v[i][i])<1e-7) continue;
for(j=n+1;j>=i;j--) v[i][j]/=v[i][i];
for(j=1;j<=n;j++) if(i!=j)
{
for(k=1;k<=n+1;k++) if(i!=k) v[j][k]-=v[j][i]*v[i][k];
v[j][i]=0;
}
}
for(i=1;i<=m;i++)
{
if(pa[i]!=n&&fabs(v[pa[i]][pa[i]])>1e-7) pc[i]+=v[pa[i]][n+1]/d[pa[i]];
if(pb[i]!=n&&fabs(v[pb[i]][pb[i]])>1e-7) pc[i]+=v[pb[i]][n+1]/d[pb[i]];
}
sort(pc+1,pc+m+1);
for(i=1;i<=m;i++) ans+=(m-i+1)*pc[i];
printf("%.3lf",(double)ans);
return 0;
}
【BZOJ3143】[Hnoi2013]游走 期望DP+高斯消元的更多相关文章
- BZOJ3143: [Hnoi2013]游走(期望DP 高斯消元)
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3597 Solved: 1618[Submit][Status][Discuss] Descript ...
- bzoj 3143 [Hnoi2013]游走 期望dp+高斯消元
[Hnoi2013]游走 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3394 Solved: 1493[Submit][Status][Disc ...
- 2018.09.23 bzoj3143: [Hnoi2013]游走(dp+高斯消元)
传送门 显然只需要求出所有边被经过的期望次数,然后贪心把边权小的边定城大的编号. 所以如何求出所有边被经过的期望次数? 显然这只跟边连接的两个点有关. 于是我们只需要求出两个点被经过的期望次数. 对于 ...
- bzoj3143 游走 期望dp+高斯消元
题目传送门 题意: 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获得 ...
- bzoj3143: [Hnoi2013]游走(贪心+高斯消元)
考虑让总期望最小,那么就是期望经过次数越多的边贪心地给它越小的编号. 怎么求每条边的期望经过次数呢?边不大好算,我们考虑计算每个点的期望经过次数f[x],那么一条边的期望经过次数就是f[x]/d[x] ...
- BZOJ 3143: [Hnoi2013]游走 [概率DP 高斯消元]
一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获得等于这条边的编号的分 ...
- 【洛谷3232】[HNOI2013] 游走(贪心+高斯消元)
点此看题面 大致题意: 一个无向连通图,小\(Z\)从\(1\)号顶点出发,每次随机选择某条边走到下一个顶点,并将\(ans\)加上这条边的编号,走到\(N\)号顶点时结束.请你对边进行编号,使总分期 ...
- BZOJ_3143_[Hnoi2013]游走_期望DP+高斯消元
BZOJ_3143_[Hnoi2013]游走_期望DP+高斯消元 题意: 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机 ...
- [BZOJ3143][HNOI2013]游走(期望+高斯消元)
3143: [Hnoi2013]游走 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3576 Solved: 1608[Submit][Status ...
随机推荐
- pure-ftp 服务配置篇
FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为 "文传协议" 用于Internet上的控制文件的双向传输. FTP的主要作用,就是让 ...
- TCP/IP网络编程
https://blog.csdn.net/a987073381/article/details/52206215 TCP的传输连接分为3个阶段:连接建立(三次握手).数据传送和连接释放(四次 ...
- EarlyZ disable( earlyz失效
There are a few ways to disable EarlyZ list here: Shader depth output disabled Alpha test with depth ...
- redis批量删除多个keys
Redis的官网redis.io,大家可以查看很多命令的使用方法 说明:删除单个key比较简单,直接使用命令del xxxkey,批量删除多个keys可利用如下命令: 假设:redis的安装目录如下: ...
- 【共享单车】—— React后台管理系统开发手记:UI菜单各个组件使用(Andt UI组件)
前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录.最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star. ...
- hibernate学习系列-----(5)hibernate基本查询下篇:hibernate聚合函数、分组查询及命名查询
在上一篇中,大致学习了hibernate的基本查询:HQL基本查询,今天,继续昨天的步伐,继续学习hibernate的基本查询..... 1.hql聚合函数,先大致列一下hql的聚合函数有哪些吧: 在 ...
- PS PNG导出的时候是否交错有什么影响
已解决 导出png格式交错什么意思 我百度的答案一律说png支持交错,可是交错两个字的意思是什么啊,那位专家请指教.谢谢啦!! 问题补充: 我用photoshop或者coreldraw制作按钮时候不是 ...
- Unity里面的自动寻路(一)
来自:http://www.narkii.com/club/forum.php?mod=viewthread&tid=269146&highlight=Unity%E9%87%8C%E ...
- Laravel之备忘项(不定期更新)
1.自定义字段验证错误信息 $this->validate($request, ['name' => 'required|max:50'], ['name.required' => ...
- C# : 资源文件(多用于处理国际化)
1.建立Resource文件夹,添加资源文件 处理国际化的问题,我们可以添加多个资源文件,如下就是添加一个中文的,一个英文的. 2.向其中添加键值对. 3.取值 CultureInfo uiCultu ...