传送门


这种无向图上从一个点乱走到另一个点的期望题目好几道与高斯消元有关

首先一个显然的贪心:期望经过次数越多,分配到的权值就要越小。

设$du_i$表示$i$的度,$f_i$表示点$i$的期望经过次数(我们认为经过表示需要从这个点走出去,所以$f_N=0$),考虑到一条边$(u,v)$经过次数的期望为$\frac{f_u}{du_u}+\frac{f_v}{du_v}$,我们只需要求出$f$数组就可以求出每一条边对应的期望经过次数了。

对于$f$数组,类似于$DP$,我们可以列出一系列式子:$f_u=\frac{1}{du_u}\sum\limits_{(u,v) \in e} f_v+[u==1]$(因为$1$号点是起点,所以需要$+1$),而$f_N=0$,也就是有$N$个未知数、$N$个方程,那么我们可以通过高斯消元得到每一个$f_u$,然后这道题就做完了qaq

 #include<bits/stdc++.h>
 #define ld long double
 #define eps 1e-10
 //This code is written by Itst
 using namespace std;

 inline int read(){
     ;
     ;
     char c = getchar();
     while(c != EOF && !isdigit(c)){
         if(c == '-')
             f = ;
         c = getchar();
     }
     while(c != EOF && isdigit(c)){
         a = (a << ) + (a << ) + (c ^ ');
         c = getchar();
     }
     return f ? -a : a;
 }

 ;
 ld gauss[MAXN][MAXN] , now[MAXN * MAXN] , ans;
 struct Edge{
     int end , upEd;
 }Ed[MAXN * MAXN * ];
 int N , M , cntEd , du[MAXN] , head[MAXN];

 inline void addEd(int a , int b){
     Ed[++cntEd].end = b;
     Ed[cntEd].upEd = head[a];
     head[a] = cntEd;
 }

 inline bool equal(ld a , ld b){
     return a - eps < b && a + eps > b;
 }

 bool cmp(ld a , ld b){
     return a > b;
 }

 int main(){
 #ifndef ONLINE_JUDGE
     freopen("3232.in" , "r" , stdin);
     //freopen("3232.out" , "w" , stdout);
 #endif
     N = read();
     M = read();
      ; i <= M ; ++i){
         int a = read() , b = read();
         addEd(a , b);
         addEd(b , a);
         ++du[a];
         ++du[b];
     }
      ; i < N ; ++i){
         gauss[i][i] = ;
         for(int j = head[i] ; j ; j = Ed[j].upEd)
             if(Ed[j].end != N)
                 gauss[i][Ed[j].end] = -1.0 / du[Ed[j].end];
     }
     gauss[][N + ] = ;
      ; i < N ; ++i){
         int j = i;
         ))
             ++j;
         if(j != i)
              ; ++k)
                 swap(gauss[i][i] , gauss[j][i]);
         while(++j <= N)
              , gauss[j][i]))
                  ; k >= i ; --k)
                     gauss[j][k] -= gauss[i][k] / gauss[i][i] * gauss[j][i];
     }
      ; i ; --i){
         gauss[i][N + ] /= gauss[i][i];
         gauss[i][i] = ;
          ; j ; --j)
              , gauss[j][i])){
                 gauss[j][N + ] -= gauss[j][i] * gauss[i][N + ];
                 gauss[j][i] = ;
             }
     }
      ; i <= cntEd ; i += ){
         now[(i + ) >> ] = gauss[Ed[i].end][N + ] / du[Ed[i].end] + gauss[Ed[i + ].end][N + ] / du[Ed[i + ].end];
     }
     sort(now +  , now + M +  , cmp);
      ; i <= M ; ++i)
         ans += i * now[i];
     printf("%.3Lf" , ans);
     ;
 }

Luogu3232 HNOI2013 游走 高斯消元、期望、贪心的更多相关文章

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

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

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

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

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

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

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

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

  5. [HNOI2013][BZOJ3143] 游走 - 高斯消元

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

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

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

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

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

  8. HDU2262;Where is the canteen(高斯消元+期望)

    传送门 题意 给出一张图,LL从一个点等概率走到上下左右位置,询问LL从宿舍走到餐厅的步数期望 分析 该题是一道高斯消元+期望的题目 难点在于构造矩阵,我们发现以下结论 设某点走到餐厅的期望为Ek 1 ...

  9. [luogu3232 HNOI2013] 游走 (高斯消元 期望)

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

随机推荐

  1. base64加密和解码原理和代码

    Base64编码,是我们程序开发中经常使用到的编码方法.它是一种基于用64个可打印字符来表示二进制数据的表示方法.它通常用作存储.传输一些二进制数据编码方法!也是MIME(多用途互联网邮件扩展,主要用 ...

  2. SuperMap 三维产品资料一览表

    转自:http://blog.csdn.net/supermapsupport/article/details/68924713 如何能快速地开发项目中的三维功能呢?本文为您提供全方位的三维资料,为您 ...

  3. Android手势密码--设置和校验

    private void setGesturePassword() { toggleMore.setOnCheckedChangeListener(new CompoundButton.OnCheck ...

  4. [20171113]修改表结构删除列相关问题.txt

    [20171113]修改表结构删除列相关问题.txt --//维护表结构删除字段一般都是先ALTER TABLE <table_name> SET UNUSED (<column_n ...

  5. python第三十五天-----作业完成--学校选课系统

    选课系统:角色:学校.学员.课程.讲师要求:1. 创建北京.上海 2 所学校2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开3. 课程包含, ...

  6. linux服务器系统盘坏且系统盘为软raid的修复方法

    1 需要换新盘的情况 1.1 一块盘grub损坏修复 一块盘grub损坏修复(可通过另一块盘进入系统的情况).更换硬盘的方式,可以热插拔,也可以服务器断电后更换,但如果是热插拔,可能会导致盘符变更.坏 ...

  7. 始终使用属性(Property),而不是字段(Data Member)

    1.始终使用属性(Property),而不是字段(Data Member) C# 属性已经晋升为一等公民,如果你的类中还有public的字段,Stop.访问属性和字段的方式是一样的,但是属性是用方法( ...

  8. git 一些基本的命令操作总结

    配置远程仓库:git remote add test http://xxxx/tool/device_management.git test为远程仓库别名克隆远程仓库到本地:git clone htt ...

  9. 最大子序和的golang实现

    给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 输入: [-,,-,,-,,,-,], 输出: 解释: 连续子数组 [,-,,] 的和最大,为 ...

  10. 回文数的golang实现

    判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数 输入: 输出: true 输入: - 输出: false 解释: 从左向右读, 为 - . 从右向左读, 为 - ...