【题目描述】

一个无向连通图,顶点从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. 3 3
  2. 2 3
  3. 1 2
  4. 1 3

【样例输出】

  1. 3.333

【提示】

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

【题解】

对答案贡献大的边编号越小越好,贡献小的边编号自然需要较大,这样想明显需要求出各边经过次数的期望。

首先删去终点的出边,对于每一条边,设其两个节点为u和v:可能从u走到v,也可能从v走到u,从u走到v的期望次数等于经过点u的次数/u的度数,问题转化成求每个点的期望经过次数。

和臭气弹类似地,对于起点,一开始经过一次,也可能从其他点走过来。这是n个变量n个方程的方程组,高斯消元解方程组。
                       f[1]=1+sigma(f[j]/degree(j),j和1有边)
                   f[i]=sigma(f[j]/degree(j),j和i有边,i>=2)

求出各边期望的经过次数之后从大到小sort一下,把它的编号作为边权,计算结果即可。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cmath>
  5. #include<algorithm>
  6. using namespace std;
  7. const int sj=;
  8. const double je=1e-;
  9. int n,m,a1,a2,e,h[sj],q[sj*sj],z[sj*sj];
  10. double cd[sj],a[sj][sj],c[sj],jg,xx[sj*sj];
  11. struct B
  12. {
  13. int ne,v;
  14. }b[sj*sj*];
  15. void add(int x,int y)
  16. {
  17. b[e].v=y;
  18. b[e].ne=h[x];
  19. h[x]=e++;
  20. cd[x]++;
  21. }
  22. void init()
  23. {
  24. scanf("%d%d",&n,&m);
  25. memset(h,-,sizeof(h));
  26. for(int i=;i<=m;i++)
  27. {
  28. scanf("%d%d",&a1,&a2);
  29. q[i]=a1;
  30. z[i]=a2;
  31. if(a1!=n) add(a1,a2);
  32. if(a2!=n) add(a2,a1);
  33. }
  34. for(int i=;i<n;i++)
  35. {
  36. a[i][i]=;
  37. for(int j=h[i];j!=-;j=b[j].ne)
  38. a[b[j].v][i]-=/cd[i];
  39. }
  40. c[]=;
  41. a[n][n]=;
  42. }
  43. void jh(double &x,double &y)
  44. {
  45. double temp=y;
  46. y=x;
  47. x=temp;
  48. }
  49. void gs()
  50. {
  51. int zd;
  52. double temp;
  53. for(int i=;i<=n;i++)
  54. {
  55. zd=i;
  56. temp=fabs(a[i][i]);
  57. for(int j=i+;j<=n;j++)
  58. if(temp<fabs(a[j][i]))
  59. {
  60. zd=j;
  61. temp=fabs(a[j][i]);
  62. }
  63. if(zd!=i)
  64. {
  65. for(int j=;j<=n;j++)
  66. jh(a[i][j],a[zd][j]);
  67. jh(c[i],c[zd]);
  68. }
  69. if(fabs(a[i][i])<je) continue;
  70. temp=a[i][i];
  71. for(int j=;j<=n;j++)
  72. a[i][j]/=temp;
  73. c[i]/=temp;
  74. for(int j=;j<=n;j++)
  75. if(i!=j)
  76. {
  77. temp=a[j][i];
  78. for(int k=;k<=n;k++)
  79. a[j][k]-=a[i][k]*temp;
  80. c[j]-=c[i]*temp;
  81. }
  82. }
  83. }
  84. int main()
  85. {
  86. //freopen("t.txt","r",stdin);
  87. freopen("walk.in","r",stdin);
  88. freopen("walk.out","w",stdout);
  89. init();
  90. gs();
  91. for(int i=;i<=m;i++)
  92. {
  93. if(cd[q[i]])
  94. xx[i]+=c[q[i]]/cd[q[i]];
  95. if(cd[z[i]])
  96. xx[i]+=c[z[i]]/cd[z[i]];
  97. }
  98. sort(xx+,xx+m+,greater<double>());
  99. for(int i=;i<=m;i++)
  100. jg+=xx[i]*i;
  101. printf("%.3lf",jg);
  102. //while(1);
  103. return ;
  104. }

游走[HNOI2013]的更多相关文章

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

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

  2. [补档][Hnoi2013]游走

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

  3. [HNOI2011]XOR和路径 && [HNOI2013]游走

    [HNOI2011]XOR和路径 题目大意 具体题目:戳我 题目: 给定一个n个点,m条边的有重边.有自环的无向图,其中每个边都有一个边权. 现在随机选择一条1到n的路径,路径权值为这条路径上所有边权 ...

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

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

  5. P3232 [HNOI2013]游走 解题报告

    P3232 [HNOI2013]游走 题目描述 一个无向连通图,顶点从\(1\)编号到\(N\),边从\(1\)编号到\(M\). 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概 ...

  6. [BZOJ3143][HNOI2013]游走(期望+高斯消元)

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

  7. BZOJ3141 Hnoi2013 游走 【概率DP】【高斯消元】*

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

  8. 「HNOI2013」游走

    「HNOI2013」游走 题目描述 一个无向连通图,顶点从 \(1\) 编号到 \(N\) ,边从 \(1\) 编号到 \(M\) .小 \(Z\) 在该图上进行随机游走,初始时小 \(Z\) 在 \ ...

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

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

随机推荐

  1. EntityFramework连接SQLite

    EF很强大,可惜对于SQLite不支持CodeFirst模式(需要提前先设计好数据库表结构),不过对SQLite的数据操作还是很好用的. 先用SQLiteManager随便创建一个数据库和一张表:

  2. php 多维数组简化(递归)

    <?php $a=[ 'a'=>['d'=>['aa'=>1,'bb'=>2,'cc'=>3]], 'b'=>['f'=>['dd'=>4,'ee ...

  3. mysql 左连接 右连接 内链接

    一般所说的左连接,右连接是指左外连接,右外连接.做个简单的测试你看吧.先说左外连接和右外连接:[TEST1@orcl#16-12月-11] SQL>select * from t1;ID NAM ...

  4. JavaScript 定义 类

    JavaScript 定义 类 一 构建类的原则 构造函数 等于 原型的constructor //构造函数 function Hero(name,skill){ this.name = name; ...

  5. tkinter模块常用参数(python3)

    1.使用tkinter.Tk() 生成主窗口(root=tkinter.Tk()):root.title('标题名')    修改框体的名字,也可在创建时使用className参数来命名:root.r ...

  6. 使用matplotlib绘制多轴图

    一个绘图对象(figure)可以包含多个轴(axis),在Matplotlib中用轴表示一个绘图区域,可以将其理解为子图.上面的第一个例子中,绘图对象只包括一个轴,因此只显示了一个轴(子图).我们可以 ...

  7. 4个小时实现一个HTML5音乐播放器

    技术点:ES6+Webpack+HTML5 Audio+Sass 这里,我们将一步步的学到如何从零去实现一个H5音乐播放器. 首先来看一下最终的实现效果:Demo链接 接下来就步入正题: 要做一个音乐 ...

  8. python简单实现websocket

    协议选择的是新的Hybi-10,参考文章如下: http://www.cnblogs.com/zhuweisky/p/3930780.html http://blog.mycolorway.com/2 ...

  9. 函数的上下文就是函数里面的this是谁

    规律1:函数用圆括号调用,函数的上下文是window对象 比如小题目: function fun(){ var a = 888; alert(this.a); //实际上访问的是window.a } ...

  10. python编程快速上手之第9章实践项目参考答案

    本章介介绍了shutil,zipfile模块的使用,我们先来认识一下这2个模块吧. 一.shutil模块 shutil模块主要用于对文件或文件夹进行处理,包括:复制,移动,改名和删除文件,在shuti ...