题目传送门

题意:

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

思路:很显然,我们肯定希望经过次数最多的边的标号最小,但是由于边的数量可能很多,而且好像也不存在什么很好转移的东西,那么我们就需要考虑点。

  假设E[X]代表从x这个点出发的次数,那么对于{u,v}这样一条边的被经过的次数显然等于$\frac{E[u]}{deg[u]}+\frac{E[v]}{deg[v]}$ deg代表度数,也就是从其他点过来的概率。所以我们只要算出E[x]就可以完成这道题了。

  我们考虑一般的u(除了起点和终点),显然易得$E[X]=\sum \frac {E[v]}{deg[v]}$。

  而终点就是的E[X]就是0,起点的期望,除了上述的式子,还需要加入最初始的1.(游戏开局),由于我们这样可以得到n个式子,而且n个式子之间存在推来推去的关系,显然可以考虑高斯消元。

  所以就按照上面这个式子高斯消元求解,然后把边按经过次数排序就是答案了。

  1. #pragma GCC optimize (2)
  2. #pragma G++ optimize (2)
  3. #pragma comment(linker, "/STACK:102400000,102400000")
  4. #include<bits/stdc++.h>
  5. #define rep(i,a,b) for(int i=a;i<=b;i++)
  6. #define dep(i,b,a) for(int i=b;i>=a;i--)
  7. #define clr(a,b) memset(a,b,sizeof(a))
  8. #define pb push_back
  9. #define pii pair<int,int >
  10. using namespace std;
  11. typedef long long ll;
  12. ll rd()
  13. {
  14. ll x=,f=;char ch=getchar();
  15. while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
  16. while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
  17. return x*f;
  18. }
  19. const int maxn=;
  20. const int inf=0x3f3f3f3f;
  21. int T,n,m;
  22. vector<int >ve[maxn];
  23. struct edge{
  24. int u,v;
  25. double g;
  26. friend bool operator<(const edge &a,const edge &b){
  27. return a.g>b.g;
  28. }
  29. }e[maxn*maxn];
  30. const double eps=1e-;
  31. int equ=,var=;
  32. double a[maxn][maxn],x[maxn],deg[maxn];
  33. int Gauss()//高斯消元 返回 0 无解 返回 1有解
  34. {
  35. int i,j,k,col,max_r;
  36. for(k=,col=;k<equ&&col<var;k++,col++)
  37. {
  38. max_r=k;
  39. for(i=k+;i<equ;i++)
  40. if(fabs(a[max_r][col])>fabs(a[max_r][col]))
  41. max_r=i;
  42. if(fabs(a[max_r][col])<eps) return ;
  43. if(k!=max_r)
  44. {
  45. for(j=col;j<var;j++)
  46. swap(a[k][j],a[max_r][j]);
  47. swap(x[k],x[max_r]);
  48. }
  49. x[k]/=a[k][col];
  50. for(j=col+;j<var;j++) a[k][j]/=a[k][col];
  51. a[k][col]=;
  52. for(i=;i<equ;i++)
  53. {
  54. if(i!=k)
  55. {
  56. x[i]-=x[k]*a[i][col];
  57. for(j=col+;j<var;j++) a[i][j]-=a[k][j]*a[i][col];
  58. a[i][col]=;
  59. }
  60. }
  61. }
  62. return ;
  63. }
  64. int main(){
  65. cin>>n>>m;
  66. rep(i,,m){
  67. scanf("%d%d",&e[i].u,&e[i].v);
  68. deg[e[i].u]++;
  69. deg[e[i].v]++;
  70. ve[e[i].u].push_back(e[i].v);
  71. ve[e[i].v].push_back(e[i].u);
  72. }
  73. x[]=;
  74. a[n-][n-]=;
  75. equ=var=n+;
  76. rep(i,,n-){
  77. a[i-][i-]=;
  78. //for(auto &v:ve[i]){
  79. for(int j=;j<ve[i].size();j++){
  80.  
  81. int v=ve[i][j];
  82. if(v!=n)
  83. a[i-][v-]=-/deg[v];
  84. }
  85. }
  86. Gauss();
  87. for(int i=;i<=m;i++){
  88. e[i].g=;
  89. if(e[i].u!=n)
  90. e[i].g+=x[e[i].u-]/deg[e[i].u];
  91. if(e[i].v!=n)
  92. e[i].g+=x[e[i].v-]/deg[e[i].v];
  93. }
  94. sort(e+,e++m);
  95. double ans=;
  96. rep(i,,m){
  97. ans+=i*e[i].g;
  98. }
  99. printf("%.3f\n",ans);
  100. }

bzoj3143 游走 期望dp+高斯消元的更多相关文章

  1. 【BZOJ3143】[Hnoi2013]游走 期望DP+高斯消元

    [BZOJ3143][Hnoi2013]游走 Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 ...

  2. BZOJ3143: [Hnoi2013]游走(期望DP 高斯消元)

    Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3597  Solved: 1618[Submit][Status][Discuss] Descript ...

  3. bzoj 3143 [Hnoi2013]游走 期望dp+高斯消元

    [Hnoi2013]游走 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3394  Solved: 1493[Submit][Status][Disc ...

  4. 2018.09.23 bzoj3143: [Hnoi2013]游走(dp+高斯消元)

    传送门 显然只需要求出所有边被经过的期望次数,然后贪心把边权小的边定城大的编号. 所以如何求出所有边被经过的期望次数? 显然这只跟边连接的两个点有关. 于是我们只需要求出两个点被经过的期望次数. 对于 ...

  5. BZOJ 3143: [Hnoi2013]游走 [概率DP 高斯消元]

    一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获得等于这条边的编号的分 ...

  6. BZOJ_3143_[Hnoi2013]游走_期望DP+高斯消元

    BZOJ_3143_[Hnoi2013]游走_期望DP+高斯消元 题意: 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机 ...

  7. bzoj3143: [Hnoi2013]游走(贪心+高斯消元)

    考虑让总期望最小,那么就是期望经过次数越多的边贪心地给它越小的编号. 怎么求每条边的期望经过次数呢?边不大好算,我们考虑计算每个点的期望经过次数f[x],那么一条边的期望经过次数就是f[x]/d[x] ...

  8. 期望dp+高斯消元——bzoj3143

    比较经典的题,题解看网上的..https://www.cnblogs.com/GXZlegend/p/7054536.html 自己sort弄错了..还以为是高斯消元写歪了.. #include< ...

  9. 【noi2019集训题1】 脑部进食 期望dp+高斯消元

    题目大意:有n个点,m条有向边,每条边上有一个小写字母. 有一个人从1号点开始在这个图上随机游走,游走过程中他会按顺序记录下走过的边上的字符. 如果在某个时刻,他记录下的字符串中,存在一个子序列和S2 ...

随机推荐

  1. 实习记——《Rethink》

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/gmszone/article/details/30045055 最终能够在和自己的电脑上写下这些字了 ...

  2. Puppeteer自动化批量上传抖音视频

    前言:最近因为项目宣传,所以用Puppeteer写了一个批量上传抖音视频的自动化程序用于推广. 环境和依赖:node,puppeteer 废话不多说,直接上代码: const puppeteer =r ...

  3. JavaScript_DOM详解

    节点操作: 查看对象属性的值obj.getAttribute() 如: //获取图片 var imgs = document.getElementsByTagName("img") ...

  4. codeforces1213F Unstable String Sort 思维

    题目传送门 题意:a和b都代表字符串的下标,至少用k个字符,构造一个长度为n的字符串,将这个字符串中的字符按无论是按$a$写还是按$b$写,字典序都非递减. 思路:如果将$a[l,r]=b[l,r]$ ...

  5. TCP协议中的三次握手和四次挥手(图解)(转)

    转自:http://blog.csdn.net/whuslei/article/details/6667471 建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 先来看看 ...

  6. PHP-全排列

    给定一个没有重复数字的序列,返回其所有可能的全排列. 示例: 输入: [1,2,3]输出:[ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]] ...

  7. hdu 5792 树状数组+离散化+思维

    题目大意: Given a sequence A with length n,count how many quadruple (a,b,c,d) satisfies: a≠b≠c≠d,1≤a< ...

  8. Java高并发网络编程(五)Netty应用

    推送系统 一.系统设计 二.拆包和粘包 粘包.拆包表现形式 现在假设客户端向服务端连续发送了两个数据包,用packet1和packet2来表示,那么服务端收到的数据可以分为三种,现列举如下: 第一种情 ...

  9. ApiCloud如何一键真机测试

    首先假设你已经有了APICloud账号,并创建了App项目. 需要注意的是,手机和电脑需要连接在同一wifi环境下. 第一步 下载自定义Loader 进入“开发控制台” 点击我们的项目 选择模块,再选 ...

  10. JMeter Http请求之content-type用法

    转载自https://www.cnblogs.com/imyalost/p/6726795.html 本文讲三种content-type以及在Jmeter中对应的参数输入方式 第一部分:目前工作中涉及 ...