【题解】金牌导航-高斯消元/Luogu P3232 游走
题目描述:


详细分析:
我们对于编号的分配,很明显可以发现如下的分配就是期望最小的:对经过的期望次数越大的边赋予更小的编号。
那么问题就转化为了怎么求一条边的经过的期望次数,我们发现边数非常大所以肯定不好弄,所以我们就转而看很少的点。因为我们会发现如果我们能知道经过每个点的期望次数,那么这条边的期望次数很轻松就能表达出来。
比如如下的式子:(设 \(ans[i]\) 为经过第 \(i\) 个点的期望次数, \(du[i]\) 为第 \(i\) 个点的度数, \(res[i]\) 为经过第 \(i\) 条边的期望次数)
\]
这个式子应该很好理解,就是说每个点等概率地选择和他相连的边,所以选择这一条边地期望次数就是经过它的期望次数除以它的度数,也就是与他相连的边的数量,因为这条边可以从两个端点开始走然后经过,所以应该加上两个端点的值。
上文探讨了如果知道经过所有点的期望次数如何求经过这条边的期望,那么下文就来看看如何求经过每个点的期望次数。
很明显可以列出这样的一个式子:
\]
注意 \(to\) 是指所有与 \(i\) 有边直接相连的点,\(to\) 不包含 \(n\) 号节点,因为这个式子的含义从是 \(to\) 等概率地回到 \(i\) 节点,可是 \(n\) 号节点就停了,也就不存在再走回来的情况了
但是其实还有一种特殊情况,就是对于 \(1\) 号节点,其作为初始节点所以一定在开始时被经过一次,所以其不仅要计算从别的点到来的期望次数,更要算其一开始的这一次
\]
我们会发现上文的这个式子会出现循环依赖的情况,就是假设 \(A\) 的值需要 \(B\) 的值才能推出来,但是 \(B\) 也同样需要 \(A\) 才能推出来。而且我们考虑这个式子不含有最大值最小值的操作,所以就考虑使用高斯消元,把这个式子化成一个方程,然后求解.
那么既然要高斯消元就要考虑我们的未知数是什么,我们的系数是什么,常数是什么,这一切都是根据我上面的式子得出来的.
首先未知数肯定非常容易,就是我们不知道的数嘛,那我们不知道什么?就是 \(ans\) 数组啊,所以 \(ans\) 就是我们的未知数, \(ans[i]\) 就代表我们的第 \(i\) 个未知数.
这个明白了之后剩下的就非常简单的,考虑对上面的式子进行转化
\]
很明显 \(du\) 数组我们是知道的,又发现有一个 \(\dfrac{1}{du[to]} \times ans[to]\) 的项,所以 \(du\) 数组就理所应当的成为了我们的系数
会发现了常数项除了 \(ans[1]\) 的方程含有一个 \(1\) ,其他的都是 \(0\).
注意在代码里我的 \(a\) 数组开的二维,因为我们的高斯消元需要知道第几个方程,所以就按照第一个点的顺序给方程编了号,所以 \(a\) 数组的第一维就是编号,第二维才是我们的未知数,这也就与正常的高斯消元一样了
代码详解:
点击查看代码
#include<bits/stdc++.h>
using namespace std;
const double eps = 1e-6;
const int MAXN = 505;
const int MAXM = 130000;
struct edge{
int nxt,to;
edge(int _nxt = 0,int _to = 0){
nxt = _nxt,to = _to;
}
}e[2 * MAXM];
double a[MAXN][MAXN];
double ans[MAXN],res[MAXM];
int from[MAXM],to[MAXM],head[MAXN],du[MAXN];
int n,m,cnt;
void Gauss(int n){ //推荐里面写一个 n ,然后直接按模板敲就好了
for(int i=1; i<=n; i++){
int mx = i;
for(int j=i + 1; j<=n; j++){
if(fabs(a[j][i]) > fabs(a[mx][i])){
mx = j;
}
}
if(mx != i) {
for(int j=1; j<=n+1; j++){
swap(a[i][j],a[mx][j]);
}
}
for(int j=1; j<=n; j++){
if(j != i){
double tmp = a[j][i] / a[i][i];
for(int k=i; k<=n+1; k++){
a[j][k] -= tmp * a[i][k];
}
}
}
}
for(int i=1; i<=n; i++){ //ans[i] 即我们最后解出来的解
ans[i] = a[i][n+1] / a[i][i];
}
}
void add_edge(int from,int to){
e[++cnt] = edge(head[from],to);
head[from] = cnt;
}
int main(){
cin>>n>>m;
for(int i=1; i<=m; i++){
cin>>from[i]>>to[i];
add_edge(from[i],to[i]);
add_edge(to[i],from[i]);
du[from[i]]++;du[to[i]]++;
}
for(int i=1; i<n; i++){ //注意一点,因为到 n 就停了,所以 n 的期望等就不用算了
a[i][i] = 1; //根据我们的式子可以化出来
for(int j=head[i]; j; j = e[j].nxt){
int to = e[j].to;
if(to != n){ //注意 to != n
a[i][to] = -1.0/du[to]; //根据我们的式子可以化出来
}
}
}
a[1][n] = 1; //根据式子可以化出来
Gauss(n-1);
for(int i=1; i<=m; i++){
if(from[i] != n){
res[i] += ans[from[i]] / du[from[i]]; //到达这个点的期望除以度数,就是从这个点到当前点的期望
}
if(to[i] != n){
res[i] += ans[to[i]] / du[to[i]];
}
}
sort(res+1,res+m+1); //从小到大排边
//一定要相信 STL,如果自己写一个 cmp(例如我),就会造成神奇的精度问题
double h = 0;
for(int i=1; i<=m; i++){
//越大的期望的边给他越小的编号
h += res[i] * (m - i + 1);
}
printf("%.3f",h);
return 0;
}
我的上文对这个代码的解释应该也比较合理了,如果有任何疑问或者感觉我说的不对的地方欢迎大家留言或者私信我
【题解】金牌导航-高斯消元/Luogu P3232 游走的更多相关文章
- HDU4870_Rating_双号从零单排_高斯消元求期望
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4870 原题: Rating Time Limit: 10000/5000 MS (Java/Other ...
- 【bzoj3601】一个人的数论 莫比乌斯反演+高斯消元
题目描述 题解 莫比乌斯反演+高斯消元 (前方高能:所有题目中给出的幂次d,公式里为了防止混淆,均使用了k代替) #include <cstdio> #include <cstrin ...
- 【bzoj2115】[Wc2011] Xor DFS树+高斯消元求线性基
题目描述 输入 第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目. 接下来M 行描述 M 条边,每行三个整数Si,Ti ,Di,表示 Si 与Ti之间存在 一条权值为 Di的无向边. 图 ...
- 【bzoj4184】shallot 线段树+高斯消元动态维护线性基
题目描述 小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把小葱叫过来玩游戏. 每个时刻她会给小葱一颗小葱苗或者是从小葱手里拿走一颗小葱苗,并且 让小葱从自己手中的小 ...
- luogu P2962 [USACO09NOV]灯Lights 高斯消元
目录 题目链接 题解 题目链接 luogu P2962 [USACO09NOV]灯Lights 题解 可以折半搜索 map合并 复杂度 2^(n / 2)*logn 高斯消元后得到每个点的翻转状态 爆 ...
- 2017年中国大学生程序设计竞赛-中南地区赛暨第八届湘潭市大学生计算机程序设计大赛题解&源码(A.高斯消元,D,模拟,E,前缀和,F,LCS,H,Prim算法,I,胡搞,J,树状数组)
A------------------------------------------------------------------------------------ 题目链接:http://20 ...
- BZOJ 1013 | 一份写了一堆注释的高斯消元题解
题意 给出\(n\)维直角坐标系中\(n + 1\)个点的坐标,它们都在一个\(n\)维球面上,求球心坐标. 题解 设球面上某两个点坐标为\((a_1, a_2, ... a_n)\)和\((b_1, ...
- 【Luogu】P3317重建(高斯消元+矩阵树定理)
题目链接 因为这个专门跑去学了矩阵树定理和高斯消元qwq 不过不是很懂.所以这里只放题解 玫葵之蝶的题解 某未知dalao的矩阵树定理 代码 #include<cstdio> #inclu ...
- Luogu P3389 高斯消元
https://www.luogu.com.cn/problem/P3389 主元消元法[模板] 高斯消元是解决多元线性方程组的方法,再学习它之前,先引入一个东西--行列式 行列式的性质: 这里我们只 ...
随机推荐
- springboot实现热部署的几种方式
原理:使用了两个ClassLoader,一个Classloader加载那些不会改变的类(第三方Jar包),另一个ClassLoader加载会更改的类,称为restart ClassLoader,这样在 ...
- 在 Spring 框架中如何更有效地使用 JDBC?
使用 SpringJDBC 框架,资源管理和错误处理的代价都会被减轻.所以开发者只 需写 statements 和 queries 从数据存取数据,JDBC 也可以在 Spring 框架提供 的模板类 ...
- 四、PCB初始化设置
1.参数设置Setup-Design Parameters 2.显示设置 3.颜色设置(自定义) 4..栅格设置(走线层将25分为5等份)
- JavaScript正则进阶之路——活学妙用奇淫正则表达式
原文收录在我的 GitHub博客 (https://github.com/jawil/blog) ,喜欢的可以关注最新动态,大家一起多交流学习,共同进步,以学习者的身份写博客,记录点滴. 有些童鞋肯定 ...
- 7分钟理解JS的节流、防抖及使用场景
前言 据说阿里有一道面试题就是谈谈函数节流和函数防抖.糟了,这可触碰到我的知识盲区了,好像听也没听过这2个东西,痛定思痛,赶紧学习学习.here we go! 概念和例子 函数防抖(debounce) ...
- H5本地存储:sessionStorage和localStorage
作者:心叶时间:2018-05-01 18:30 H5提供了二种非常好用的本地存储方法:sessionStorage和localStorage,下面分别介绍一下: 1.sessionStorage:保 ...
- 基 vue-element-admin升级的Vue3 +TS +Element-Plus 版本的后端管理前端解决方案 vue3-element-admin 正式对外发布,有来开源组织又一精心力作,毫无保留开放从0到1构建过程
项目简介 vue3-element-admin 是基于 vue-element-admin 升级的 Vue3 + Element Plus 版本的后台管理前端解决方案,是 有来技术团队 继 youla ...
- Initialization failed for 'https://start.spring.io
本文精华(没空的小伙伴,直接看精华部分即可) 1.精华1: 开发/下载项目的时候考虑系统必备的版本兼容性 2.精华2: 通过火狐浏览器访问官网的旧版本,下载到任意需要的项目版本,然后通过项目导入ide ...
- Canvas 制作海报
HTML <template> <view class="content"> <view class="flex_row_c_c mod ...
- 【每日日报】第五十三天---安装My SQL
1 2今天安装了My SQL并学习了一些基础的命令 mysql下载及安装教程 2 没有成功安装SQL Server,误删了一些文件 3 明天继续看视频 ------------------------ ...