题目描述

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

输入输出格式

输入格式:

第一行是正整数N和M,分别表示该图的顶点数
和边数,接下来M行每行是整数u,v(1<=u,v<=N),表示顶点u与顶点v之间存在一条边。
输入保证30%的数据满足N<=10,100%的数据满足2<=N<=500且是一个无向简单连通图。

输出格式:

仅包含一个实数,表示最小的期望值,保留3位小数。

输入输出样例

输入样例#1:

  1. 3 3
  2. 2 3
  3. 1 2
  4. 1 3
输出样例#1:

  1. 3.333

说明

边(1,2)编号为1,边(1,3)编号2,边(2,3)编号为3。


题解

  期望dp。

  贪心地想,我们肯定要往那个期望到达次数最大的边赋最小的权值;

  所以问题转化成了求边的期望到达次数;

  我们发现一条边连着唯一的两个点,我们要知道边的期望,首先要知道到达每个点的期望次数;

  我们设f[i]表示第i个点的期望到达次数,即f[i] = ∑(f[to[i]] * deg[to[i]]) ,deg[i]表示一个点的度数;

  这样我们发现可以高斯消元解出;要注意的是1号点的期望还得加上1因为从他开始必定经过;

  然后求g[i],即边i的期望到达次数,g[i] = f[l[i]]/deg[l[i]] + f[r[i]]/deg[r[i]],l r表示这个边链接的两个点;

  要注意如果是n号点的话,就不用考虑,因为到了n点就不会继续游走了;

  然后就贪心地赋边权;


Code

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cmath>
  4. #include <algorithm>
  5. using namespace std;
  6. #define eps 1e-8
  7.  
  8. int n, m;
  9. struct edge
  10. {
  11. int from, to;
  12. int nxt;
  13. }ed[];
  14. int deg[], head[];
  15. int cnt;
  16. int fr[], tt[];
  17. inline void add(int x, int y){ed[++cnt] = (edge){x, y, head[x]};head[x] = cnt;}
  18.  
  19. double g[];
  20. double a[][];
  21. double ans;
  22.  
  23. inline void Gauss_()
  24. {
  25. for (register int i = ; i < n ; i ++)
  26. {
  27. int pivot = i ;
  28. for (register int j = i + ; j < n ; j ++)
  29. {
  30. if (fabs(a[j][i] - a[pivot][i]) <= eps) pivot = j;
  31. }
  32. if (pivot != i)
  33. for (register int j = ; j <= n ; j ++)
  34. swap(a[i][j], a[pivot][j]);
  35. for (register int j = n ; j >= i ; j --) a[i][j] /= a[i][i];
  36. for (register int j = ; j < n ; j ++)
  37. if (i != j)
  38. for (register int k = n ; k >= i ; k --)
  39. a[j][k] -= a[j][i] * a[i][k];
  40. }
  41. }
  42.  
  43. int main()
  44. {
  45. scanf("%d%d", &n, &m);
  46. for (register int i = ; i <= m; i ++)
  47. {
  48. int x, y;
  49. scanf("%d%d", &x, &y);
  50. deg[x]++, deg[y]++;
  51. fr[i] = x, tt[i] = y;
  52. add(x, y);
  53. add(y, x);
  54. }
  55.  
  56. a[][n] = ;
  57. for (register int i = ; i < n; i ++)
  58. {
  59. a[i][i] = ;
  60. for (register int j = head[i]; j; j = ed[j].nxt)
  61. {
  62. int to = ed[j].to ;
  63. if (to != n) a[i][to] = -1.0/deg[to];
  64. }
  65. }
  66.  
  67. Gauss_();
  68.  
  69. for (register int i = ; i <= m ; i ++)
  70. {
  71. if (fr[i] != n )
  72. g[i] += a[fr[i]][n] * (1.0 / deg[fr[i]]) ;
  73. if (tt[i] != n)
  74. g[i] += a[tt[i]][n] * (1.0 / deg[tt[i]]);
  75. }
  76.  
  77. sort(g + , g + + m);
  78. for (register int i = ; i <= m ; i ++)
  79. ans += (m - i + ) * 1.0 * g[i];
  80. printf("%.3lf", ans);
  81.  
  82. return ;
  83.  
  84. }

[HNOI2013][BZOJ3143] 游走 - 高斯消元的更多相关文章

  1. 【BZOJ3143】【HNOI2013】游走 高斯消元

    题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3143 我们令$P_i$表示从第i号点出发的期望次数.则$P_n$显然为$0$. 对于$P ...

  2. 【BZOJ-3143】游走 高斯消元 + 概率期望

    3143: [Hnoi2013]游走 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2264  Solved: 987[Submit][Status] ...

  3. bzoj 3143: [Hnoi2013]游走 高斯消元

    3143: [Hnoi2013]游走 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1026  Solved: 448[Submit][Status] ...

  4. BZOJ 3143 HNOI2013 游走 高斯消元 期望

    这道题是我第一次使用高斯消元解决期望类的问题,首发A了,感觉爽爽的.... 不过笔者在做完后发现了一些问题,在原文的后面进行了说明. 中文题目,就不翻大意了,直接给原题: 一个无向连通图,顶点从1编号 ...

  5. Luogu3232 HNOI2013 游走 高斯消元、期望、贪心

    传送门 这种无向图上从一个点乱走到另一个点的期望题目好几道与高斯消元有关 首先一个显然的贪心:期望经过次数越多,分配到的权值就要越小. 设$du_i$表示$i$的度,$f_i$表示点$i$的期望经过次 ...

  6. 【xsy1201】 随机游走 高斯消元

    题目大意:你有一个$n*m$的网格(有边界),你从$(1,1)$开始随机游走,求走到$(n,m)$的期望步数. 数据范围:$n≤10$,$m≤1000$. 我们令 $f[i][j]$表示从$(1,1) ...

  7. BZOJ3143:[HNOI2013]游走(高斯消元)

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

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

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

  9. 【BZOJ3143】【HNOI2013】游走 && 【BZOJ3270】博物馆 【高斯消元+概率期望】

    刚学完 高斯消元,我们来做几道题吧! T1:[BZOJ3143][HNOI2013]游走 Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小 ...

随机推荐

  1. spring data jpa介绍

    首先了解JPA是什么? JPA(JavaPersistence API)是Sun官方提出的Java持久化规范.它为Java开发人员提供了一种对象/关联映射工具来管理Java应用中的关系数据.他的出现主 ...

  2. hbase数据备份或者容灾方案

    HBase的数据备份或者容灾方案有这几种:Distcp,CopyTable,Export/Import,Snapshot,Replication,以下分别介绍(以下描述的内容均是基于0.94.20版本 ...

  3. C#面试题目整理(一)

    1.您在什么情况下会用到虚方法?它与接口有什么不同?当子类需要重新定义父类的一个方法时,父类的方法需要定义为虚方法:在定义接口的时候不能又方法体,但是虚方法可以有方法体,实现时,子类可以不实现父类的虚 ...

  4. 【linux】【mysql】mysql主从数据库

    系统环境:Centos7 主:192.168.8.162 从:192.168.8.127 前提条件 a.关闭防火墙  systemctl stop firewalld 关闭防火墙开机自启 system ...

  5. 【linux】linux固定ip

    vi /etc/sysconfig/network-scripts/ifcfg-ens33  ifcfg-ens33为ifconfig显示的网卡名 TYPE="Ethernet"P ...

  6. Transformer各层网络结构详解!面试必备!(附代码实现)

    1. 什么是Transformer <Attention Is All You Need>是一篇Google提出的将Attention思想发挥到极致的论文.这篇论文中提出一个全新的模型,叫 ...

  7. Linux 中文打字软件 gtypist 光标错位解决

    在windows 下有 金山打字和其他的跟打软件,在Linux下找到了 gtypist 为练习中文打字,该软件分为练习模式的速度测试模式,在gtypist-2.9.5版中会出现以下几个问题: 一是在练 ...

  8. phpStudy后门漏洞利用复现

    phpStudy后门漏洞利用复现 一.漏洞描述 Phpstudy软件是国内的一款免费的PHP调试环境的程序集成包,通过集成Apache.PHP.MySQL.phpMyAdmin.ZendOptimiz ...

  9. JS/JQuery 禁用超链接a

    JS // 禁用超链接元素elem ; document.getElementById(elemID).setAttribute('disabled', 'disabled'); // 启用超链接元素 ...

  10. .Net Core自动化部署系列(三):使用GitLab CI/CD 自动部署Api到Docker

    之前写过使用Jenkins实现自动化部署,最近正好没事研究了下GitLab的自动化部署,顺便记录一下. 使用GitLab部署我们需要准备两件事,第一个起码你得有个GitLab,自己搭建或者使用官方的都 ...