BZOJ 3143 游走 | 数学期望 高斯消元
啊 我永远喜欢期望题
BZOJ 3143 游走
题意
有一个n个点m条边的无向联通图,每条边按1m编号,从1号点出发,每次随机选择与当前点相连的一条边,走到这条边的另一个端点,一旦走到n号节点就停下。每经过一条边,要付出这条边的编号这么多的代价。现将所有边用1m重新编号,使总代价的期望最小,求这个最小值。
题解
我们可以求出每条边的期望经过次数,然后贪心地让经过次数多的边编号小即可。
直接用边来列方程求经过次数似乎列不出来,我们借助点来列方程。
设x[u]为从某个点出发的次数的期望,v为与u相连的点,d[v]为点d的度,则:
\]
特殊地,不能从点n出发,所以x[n] = 0;第一次从点1出发,\(x[u] = 1 + \sum \frac{x[v]}{d[v]}\)。
解出所有x后,设一条边的两个端点是u和v,则经过每条边的次数的期望是:
\]
代码如下:
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#define space putchar(' ')
#define enter putchar('\n')
using namespace std;
typedef long long ll;
template <class T>
void read(T &x){
char c;
bool op = 0;
while(c = getchar(), c < '0' || c > '9')
if(c == '-') op = 1;
x = c - '0';
while(c = getchar(), c >= '0' && c <= '9')
x = x * 10 + c - '0';
if(op) x = -x;
}
template <class T>
void write(T x){
if(x < 0) putchar('-'), x = -x;
if(x >= 10) write(x / 10);
putchar('0' + x % 10);
}
const int N = 505, M = 250005;
int n, m, u[M], v[M], d[N];
double ans[M], x[N], f[N][N], res;
void build(){
for(int i = 1; i <= n; i++)
f[i][i] = -1;
for(int e = 1; e <= m; e++){
f[u[e]][v[e]] += 1.0 / d[v[e]];
f[v[e]][u[e]] += 1.0 / d[u[e]];
}
for(int i = 1; i <= n; i++)
f[n][i] = 0;
f[n][n] = 1, f[n][n + 1] = 0;
f[1][n + 1] = -1;
}
void Gauss(){
for(int i = 1; i <= n; i++){
int l = i;
for(int j = i + 1; j <= n; j++)
if(fabs(f[j][i]) > fabs(f[l][i])) l = j;
if(l != i)
for(int j = i; j <= n + 1; j++)
swap(f[i][j], f[l][j]);
for(int j = n + 1; j >= i; j--)
f[i][j] /= f[i][i];
for(int j = i + 1; j <= n; j++)
for(int k = n + 1; k >= i; k--)
f[j][k] -= f[j][i] * f[i][k];
}
for(int i = n; i; i--){
x[i] = f[i][n + 1];
for(int j = 1; j < i; j++)
f[j][n + 1] -= f[j][i] * x[i];
}
}
int main(){
read(n), read(m);
for(int i = 1; i <= m; i++)
read(u[i]), read(v[i]), d[u[i]]++, d[v[i]]++;
build();
Gauss();
for(int i = 1; i <= m; i++)
ans[i] = x[u[i]] / d[u[i]] + x[v[i]] / d[v[i]];
sort(ans + 1, ans + m + 1);
for(int i = 1; i <= m; i++)
res += ans[i] * (m - i + 1);
printf("%.3lf\n", res);
return 0;
}
BZOJ 3143 游走 | 数学期望 高斯消元的更多相关文章
- BZOJ 3143 游走(贪心+期望+高斯消元)
一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获得等于这条边的编号的分 ...
- BZOJ.3143.[HNOI2013]游走(概率 期望 高斯消元)
题目链接 参考 远航之曲 把走每条边的概率乘上分配的标号就是它的期望,所以我们肯定是把大的编号分配给走的概率最低的边. 我们只要计算出经过所有点的概率,就可以得出经过一条边(\(u->v\))的 ...
- [HNOI2013] 游走 - 概率期望,高斯消元,贪心
假如我们知道了每条边经过的期望次数,则变成了一个显然的贪心.现在考虑如何求期望次数. 由于走到每个点后各向等概率,很显然一条边的期望次数可以与它的两个端点的期望次数,转化为求点的期望次数 考虑每个点对 ...
- BZOJ 2707: [SDOI2012]走迷宫 拓扑+高斯消元+期望概率dp+Tarjan
先Tarjan缩点 强连通分量里用高斯消元外面直接转移 注意删掉终点出边和拓扑 #include<cstdio> #include<cstring> #include<a ...
- 【洛谷3232】[HNOI2013] 游走(贪心+高斯消元)
点此看题面 大致题意: 一个无向连通图,小\(Z\)从\(1\)号顶点出发,每次随机选择某条边走到下一个顶点,并将\(ans\)加上这条边的编号,走到\(N\)号顶点时结束.请你对边进行编号,使总分期 ...
- BZOJ 3270: 博物馆 概率与期望+高斯消元
和游走挺像的,都是将概率转成期望出现的次数,然后拿高斯消元来解. #include <bits/stdc++.h> #define N 23 #define setIO(s) freope ...
- P4321-随机漫游【状压dp,数学期望,高斯消元】
正题 题目链接:https://www.luogu.com.cn/problem/P4321 题目大意 给出\(n\)个点\(m\)条边的一张无向图,\(q\)次询问. 每次询问给出一个点集和一个起点 ...
- UVa 10828 Back to Kernighan-Ritchie (数学期望 + 高斯消元)
题意:给定一个 n 个结点的有向图,然后从 1 结点出发,从每个结点向每个后继结点的概率是相同的,当走到一个没有后继结点后,那么程序终止,然后问你经过每个结点的期望是次数是多少. 析:假设 i 结点的 ...
- BZOJ 2707: [SDOI2012]走迷宫( tarjan + 高斯消元 )
数据范围太大不能直接高斯消元, tarjan缩点然后按拓扑逆序对每个强连通分量高斯消元就可以了. E(u) = 1 + Σ E(v) / degree(u) 对拍时发现网上2个程序的INF判断和我不一 ...
随机推荐
- python解释 yield 和 Generators(生成器)
yield 和 Generators(生成器) 转自:http://www.oschina.net/translate/improve-your-python-yield-and-generators ...
- 3. 第一个程序Hello, World!
第一个接口 HelloWorld 本项目所有代码均可在github上下载. 1. 编辑config.py # 基础配置类 import os class Config(object): ROOT = ...
- python-gevent模块实现socket大并发
服务器端:gevent_server.py 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 ...
- 【Docker】第三篇 Docker容器管理
一.Docker容器概述: 简单理解容器是镜像的一个实例. 镜像是静态的只读文件,而容器的运行需要可写文件层. 二.创建容器 [root@web130 ~]# docker create -it ub ...
- 面向 Web 开发者的 Sublime Text 插件
Package Control 在 Sublime Text 上大家都用 Package Control 来管理安装插件,所以它是我们要安装的第一个插件,安装方法见这里.关于 Package Cont ...
- VGG——Very deep convolutional networks for large-scale image recognition
1. 摘要 在使用非常小(3×3)的卷积核情况下,作者对逐渐增加网络的深度进行了全面的评估,通过设置网络层数达 16-19 层,最终效果取得了显著提升. 2. 介绍 近来,卷积神经网络在大规模图像识别 ...
- decode 函数及其用法
http://blog.csdn.net/oscar999/article/details/18399177
- Beta发布 _thunder_文案+美工展示
作业要求:https://edu.cnblogs.com/campus/nenu/SWE2017FALL/homework/1366 团队介绍:thunder 组成员及各位博客地址: 1.王航:htt ...
- Scrum Meeting 6 -2014.11.12
今天apec最后一天,大部分任务都差不多了,局部测试问题不大.大家修复下小细节就可以开始整合了. Member Today’s task Next task 林豪森 协助测试及服务器部署 协助测试及服 ...
- 实验三:敏捷开发与XP实践
Java实验三报告 一. 实验内容 (一)敏捷开发与XP 内容:1.敏捷开发(Agile Development)是一种以人为核心.迭代.循序渐进的开发方法. 2.极限编程(eXtreme Pro ...