题面在这里

题意

从1号点开始等概率选择路径并加上边权,直到到达n号点结束,要求将m条边赋权值1-m使得期望最小

sol

上文 zsy ycb orz

简单的贪心:求出每条边的期望经过次数,sort之后对于第x小的边赋权值为x即可

于是答案转换为求边的期望经过次数

思想转换:直接求边不好求,考虑求出每个点的期望经过次数;

那么我们同样设\(f[u]\)表示经过点u的期望次数,则有

\[f[u]=\sum_{v\in e(u,v)} {\frac{f[v]}{d[v]}}
\]

移项既有$$f[u]-\sum_{v\in e(u,v)} {\frac{f[v]}{d[v]}}=0$$

使用高斯消元直接求解,发现全都是0(WA飞了)。

需要特判:因为我们从1号点开始,所以

\[f[1]-\sum_{v\in e(1,v)} {\frac{f[v]}{d[v]}}=1
\]

n号点不能转移,因此\(f[n]=0\)

代码

  1. #include<bits/stdc++.h>
  2. #include<algorithm>
  3. #include<iostream>
  4. #include<cstdlib>
  5. #include<iomanip>
  6. #include<cstring>
  7. #include<vector>
  8. #include<cstdio>
  9. #include<string>
  10. #include<bitset>
  11. #include<cmath>
  12. #include<queue>
  13. #include<stack>
  14. #include<map>
  15. #include<set>
  16. #define mp make_pair
  17. #define pb push_back
  18. #define RG register
  19. #define il inline
  20. using namespace std;
  21. const int mod=1e9+7;
  22. const int N=510;
  23. const int M=N*N*2;
  24. const double eps=1e-10;
  25. typedef unsigned long long ull;
  26. typedef vector<int>VI;
  27. typedef long long ll;
  28. typedef double dd;
  29. il ll read(){
  30. RG ll data=0,w=1;RG char ch=getchar();
  31. while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
  32. if(ch=='-')w=-1,ch=getchar();
  33. while(ch<='9'&&ch>='0')data=data*10+ch-48,ch=getchar();
  34. return data*w;
  35. }
  36. int n,m,head[N],nxt[M],to[M],cnt,d[N],tot;
  37. dd ans;
  38. il void add(int u,int v){
  39. to[++cnt]=v;
  40. nxt[cnt]=head[u];
  41. head[u]=cnt;
  42. d[v]++;
  43. }
  44. struct edge{int u,v;dd w;}e[M];
  45. bool cmp_w(edge a,edge b){return a.w<b.w;}
  46. dd S[N][N];
  47. il bool gauss(){//高斯消元
  48. for(RG int i=1;i<=n;i++){
  49. for(RG int j=i;j<=n;j++)
  50. if(abs(S[j][i])>eps){swap(S[i],S[j]);break;}
  51. if(abs(S[i][i])<=eps)return 0;
  52. for(RG int j=i+1;j<=n;j++)
  53. for(RG int k=n+1;k>=i;k--)
  54. S[j][k]-=S[i][k]*S[j][i]/S[i][i];
  55. }
  56. for(RG int i=n;i;i--){
  57. for(RG int j=i+1;j<=n;j++)
  58. S[i][n+1]-=S[i][j]*S[j][n+1];
  59. S[i][n+1]/=S[i][i];
  60. }
  61. return 1;
  62. }
  63. int main()
  64. {
  65. n=read();m=read();
  66. for(RG int i=1,u,v;i<=m;i++){
  67. u=read();v=read();
  68. add(u,v);add(v,u);
  69. e[++tot]=(edge){u,v,0};
  70. }
  71. S[1][n+1]+=1.0;
  72. for(RG int u=1;u<n;u++)
  73. for(RG int i=head[u];i;i=nxt[i]){
  74. RG int v=to[i];
  75. S[u][v]-=1.0/d[v];
  76. }
  77. for(RG int i=1;i<=n;i++)S[i][i]+=1.0;
  78. //求出系数
  79. gauss();
  80. for(RG int i=1;i<=tot;i++)
  81. e[i].w=S[e[i].u][n+1]/d[e[i].u]+S[e[i].v][n+1]/d[e[i].v];
  82. sort(e+1,e+tot+1,cmp_w);
  83. for(RG int i=1;i<=tot;i++)
  84. ans+=(tot-i+1)*e[i].w;
  85. //排序后贪心
  86. printf("%.3lf\n",ans);
  87. return 0;
  88. }

[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. 【BZOJ3143】[Hnoi2013]游走 期望DP+高斯消元

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

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

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

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

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

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

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

随机推荐

  1. 阿里巴巴Java开发规约插件地址

    Git地址: https://github.com/alibaba/p3c eclipse 安装地址: https://p3c.alibaba.com/plugin/eclipse/update

  2. Egret学习笔记 (Egret打飞机-5.实现子弹对象)

    上一章把飞机添加到屏幕上,但是飞机要发射子弹对吧?那么这一章我们就来实现一下发射子弹,并实现一个简单的子弹对象池 先来捋一捋思路 1.创建一个子弹对象 2.然后添加一个bitmap,显示子弹贴图 3. ...

  3. python+flask:实现POST接口功能

    1.首先需要安装python和flask,这个是必须的嘛. 2.我们这里实现的是一个POST功能的简单接口. from flask import Flask, request, jsonify imp ...

  4. 剑指offer 第一个只出现一次的字符 hash

    思路:i表示字符的ASCII码值,cntp[i]表示字符出现的次数. AC代码 class Solution { public: int FirstNotRepeatingChar(string st ...

  5. 对于JAVA程序优化的一些想法,读书有感.治疗强迫症良药

    在深入了解Java虚拟机里读到:在try{}块里面执行代码,比if(x!=null)效率要高,前提是被catch的几率很低的情况下. 但是 在Effective Java里读到:因为异常机制的设计初衷 ...

  6. 情景linux--如何解决read命令产生的硬编码问题

    情景 我们知道,read命令可以读取文件内容,并把内容赋值给变量. 以如下的数据文件为例. $ cat data.txt 1 201623210021 wangzhiguo 25 2 20162321 ...

  7. duilib界面库学习(仿PC微信界面,有服务器,有数据库,可以网络通信)

    客户端代码:https://github.com/TTGuoying/duilib_ChatClient 服务器代码:https://github.com/TTGuoying/duilib_ChatS ...

  8. JQuery基础知识学习1

    1.JQuery是javascript的类库 2.下载JQuery 3.导入JQuery <script src="jquery-3.0.0.js"></scri ...

  9. 用Node.JS+MongoDB搭建个人博客(万众期待的router.js)(四)

    万众期待的router.js,是我现在最想写的一个博客.因为他包含了整个个人博客的精髓.在这里,所有的请求配置,返回的参数等等所做的业务逻辑都在这个文件里实现. 我会详细说明这些代码的作用,所以这篇博 ...

  10. 获取NVIDIA显卡的温度

    NVIDIA显卡在硬件上有温度传感器,可以感知显卡的运行环境.温度数据的获取,一般是通过调用NVIDIA的SDK的相关函数即可.SDK的下载的网址(https://developer.nvidia.c ...