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

总分的期望值=每条边的期望经过次数*边的编号 之和。

不论我们如何编号,每条边的期望经过次数是不会变的,要使得边权和的期望最小,只需要贪心地使期望次数和边权倒序对应即可。

考虑如何求每条边的经过次数,记每个点度数为di,期望通过次数为xi,每条边期望通过次数为yi则

变形一下高斯消元即可。

  1. # include <cstdio>
  2. # include <cstring>
  3. # include <cstdlib>
  4. # include <iostream>
  5. # include <vector>
  6. # include <queue>
  7. # include <stack>
  8. # include <map>
  9. # include <bitset>
  10. # include <set>
  11. # include <cmath>
  12. # include <algorithm>
  13. using namespace std;
  14. # define lowbit(x) ((x)&(-x))
  15. # define pi acos(-1.0)
  16. # define eps 1e-
  17. # define MOD
  18. # define INF
  19. # define mem(a,b) memset(a,b,sizeof(a))
  20. # define FOR(i,a,n) for(int i=a; i<=n; ++i)
  21. # define FDR(i,a,n) for(int i=a; i>=n; --i)
  22. # define bug puts("H");
  23. # define lch p<<,l,mid
  24. # define rch p<<|,mid+,r
  25. # define mp make_pair
  26. # define pb push_back
  27. typedef pair<int,int> PII;
  28. typedef vector<int> VI;
  29. # pragma comment(linker, "/STACK:1024000000,1024000000")
  30. typedef long long LL;
  31. inline int Scan() {
  32. int x=,f=; char ch=getchar();
  33. while(ch<''||ch>''){if(ch=='-') f=-; ch=getchar();}
  34. while(ch>=''&&ch<=''){x=x*+ch-''; ch=getchar();}
  35. return x*f;
  36. }
  37. inline void Out(int a) {
  38. if(a<) {putchar('-'); a=-a;}
  39. if(a>=) Out(a/);
  40. putchar(a%+'');
  41. }
  42. const int N=;
  43. //Code begin...
  44.  
  45. struct Edge{int u, v; double w;}edge[N*N];
  46. int dee[N], equ, var;
  47. bool G[N][N];
  48. double a[N][N], x[N];
  49.  
  50. int Guass(){
  51. int i, j, k, col, max_r;
  52. for (k=,col=; k<equ&&col<var; ++k,++col) {
  53. max_r=k;
  54. for (i=k+; i<equ; ++i) if (fabs(a[i][col])>fabs(a[max_r][col])) max_r=i;
  55. if (fabs(a[max_r][col])<eps) return ;
  56. if (k!=max_r) {
  57. for (j=col; j<var; ++j) swap(a[k][j],a[max_r][j]);
  58. swap(x[k],x[max_r]);
  59. }
  60. x[k]/=a[k][col];
  61. for (j=col+; j<var; ++j) a[k][j]/=a[k][col];
  62. a[k][col]=;
  63. for (i=; i<equ; ++i) if (i!=k) {
  64. x[i]-=x[k]*a[i][col];
  65. for (j=col+; j<var; ++j) a[i][j]-=a[k][j]*a[i][col];
  66. a[i][col]=;
  67. }
  68. }
  69. return ;
  70. }
  71. bool comp(Edge a, Edge b){return a.w>b.w;}
  72. int main ()
  73. {
  74. int n, m, u, v;
  75. scanf("%d%d",&n,&m);
  76. FOR(i,,m) scanf("%d%d",&u,&v), G[u][v]=G[v][u]=true, ++dee[u], ++dee[v], edge[i].u=u, edge[i].v=v;
  77. equ=var=n-;
  78. FOR(i,,n-) {
  79. if (i==) x[i-]=;
  80. a[i-][i-]=;
  81. FOR(j,,n-) {
  82. if (!G[i][j]) continue;
  83. a[i-][j-]=(-1.0)/dee[j];
  84. }
  85. }
  86. Guass();
  87. FOR(i,,m) {
  88. u=edge[i].u; v=edge[i].v;
  89. edge[i].w=x[u-]/dee[u]+x[v-]/dee[v];
  90. }
  91. sort(edge+,edge+m+,comp);
  92. double ans=;
  93. FOR(i,,m) ans+=edge[i].w*i;
  94. printf("%.3f\n",ans);
  95. return ;
  96. }

BZOJ 3143 游走(贪心+期望+高斯消元)的更多相关文章

  1. BZOJ 3143 游走 | 数学期望 高斯消元

    啊 我永远喜欢期望题 BZOJ 3143 游走 题意 有一个n个点m条边的无向联通图,每条边按1~m编号,从1号点出发,每次随机选择与当前点相连的一条边,走到这条边的另一个端点,一旦走到n号节点就停下 ...

  2. BZOJ.3143.[HNOI2013]游走(概率 期望 高斯消元)

    题目链接 参考 远航之曲 把走每条边的概率乘上分配的标号就是它的期望,所以我们肯定是把大的编号分配给走的概率最低的边. 我们只要计算出经过所有点的概率,就可以得出经过一条边(\(u->v\))的 ...

  3. [HNOI2013] 游走 - 概率期望,高斯消元,贪心

    假如我们知道了每条边经过的期望次数,则变成了一个显然的贪心.现在考虑如何求期望次数. 由于走到每个点后各向等概率,很显然一条边的期望次数可以与它的两个端点的期望次数,转化为求点的期望次数 考虑每个点对 ...

  4. BZOJ 2707: [SDOI2012]走迷宫 拓扑+高斯消元+期望概率dp+Tarjan

    先Tarjan缩点 强连通分量里用高斯消元外面直接转移 注意删掉终点出边和拓扑 #include<cstdio> #include<cstring> #include<a ...

  5. BZOJ 3270: 博物馆 概率与期望+高斯消元

    和游走挺像的,都是将概率转成期望出现的次数,然后拿高斯消元来解. #include <bits/stdc++.h> #define N 23 #define setIO(s) freope ...

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

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

  7. BZOJ 2707: [SDOI2012]走迷宫( tarjan + 高斯消元 )

    数据范围太大不能直接高斯消元, tarjan缩点然后按拓扑逆序对每个强连通分量高斯消元就可以了. E(u) = 1 + Σ E(v) / degree(u) 对拍时发现网上2个程序的INF判断和我不一 ...

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

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

  9. BZOJ 3143 Luogu P3232 [HNOI2013]游走 (DP、高斯消元)

    题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=3143 (luogu) https://www.luogu.org/pro ...

随机推荐

  1. SSISDB1:使用SSISDB管理Package

    SSISDB 系列随笔汇总: SSISDB1:使用SSISDB管理Package SSISDB2:SSIS工程的操作实例 SSISDB3:Package的执行实例 SSISDB4:当前正在运行的Pac ...

  2. SQL Server 任务调度

    SQL Server 内部集成了一个专用的操作系统,叫做SQLOS,处于SQL Server和Windows的中间层.SQLOS是一个协同式的多任务调度系统,使用非抢占式争用资源,用于管理线程调度.I ...

  3. 换新 IP 地址的时候,ORCL前置准备条件

    1. 开启虚拟机 ORCL 服务 2.   cmd > ipconfig > 3.   cmd > lsnrctl status > 4.  主机改配置文件 IP,succes ...

  4. MGR的debug版本

    debug版本的MGR 相较于 非 debug 版本,  applier性能差距有40倍之多.

  5. nginx解析漏洞,配置不当,目录遍历漏洞环境搭建、漏洞复现

    nginx解析漏洞,配置不当,目录遍历漏洞复现 1.Ubuntu14.04安装nginx-php5-fpm 安装了nginx,需要安装以下依赖 sudo apt-get install libpcre ...

  6. 廖雪峰git教程学习笔记

    对git来说,没有消息就是最好的消息 使用 git init 把当前目录变为git仓库 要在仓库里加入文件,先在仓库目录新建这个文件后,比如新建一个文件xiaobai.txt,内容为: 在命令行里输入 ...

  7. FFmpeg+vs2013开发环境配置(windows)

    1.下载ffmpeg包(dll.include.lib)   https://ffmpeg.zeranoe.com/builds/         有3个版本:Static.Shared和Dev St ...

  8. LintCode——颜色分类

    颜色分类:给定一个包含红,白,蓝且长度为 n 的数组,将数组元素进行分类使相同颜色的元素相邻,并按照红.白.蓝的顺序进行排序. 我们可以使用整数 0,1 和 2 分别代表红,白,蓝. 注意事项: 不能 ...

  9. 求二维数组最大子数组的和。郭林林&胡潇丹

    求二维数组子数组的最大值,开始思路不太清晰.先从最简单的开始. 以2*2的简单数组为例找规律, 假设最大数为a[0][0],则summax=a[0][0],比较a[0][0]+a[0][1].a[0] ...

  10. String字符串的方法

    String字符串在Java开发中是我们常用的一种数据类型,同时String字符串也为我们提供了大量的方法.通过一些实例的练习,我们可以对String字符串的方法有一个比较清楚的了解. 有一个字符串S ...