[luogu3232 HNOI2013] 游走 (高斯消元 期望)
题目描述
一个无向连通图,顶点从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 3
1 2
1 3
输出样例#1:
3.333
说明
边(1,2)编号为1,边(1,3)编号2,边(2,3)编号为3。
题解
思路就是先求出每一条边的概率,然后编号(概率大的编号小)然后乘起来就是期望
而一条边的期望值等于它所连的两个点到这条边的期望值
而一个点到一条边的期望值等于这个点的期望值*1/点的度数
而一个点(u)的期望值是与它所连的所有点(v)的期望值/度数之和
\(f[x]=\sum_{i=1}^k\frac{f[i]}{du[i]}\) k是x所连所有点的点集
根据这个每个点列出方程高斯消元即可(注意1和n点)
code:
//By Menteur_Hxy
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
#define LL long long
#define M(a,b) memset(a,(b),sizeof(a))
#define F(i,a,b) for(register int i=(a);i<=(b);i++)
#define C(i,a,b) for(register int i=(b);i>=(a);i--)
#define E(i,u) for(register int i=head[u];i;i=nxt[i])
using namespace std;
LL rd() {
LL x=0,f=1; char c=getchar();
while(!isdigit(c)) {if(c=='-') f=-f;c=getchar();}
while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();
return x*f;
}
const int N=510;
struct edge
{
int to,next;
}e[N*N*2];
int st[N*N*2],n,m,tot,x,y,s[N*N*2],ed[N*N*2];
double d[N],f[N][N],ans[N],sum,E[N*N*2];
void add(int x,int y)
{
e[++tot].to=y;
e[tot].next=st[x];
st[x]=tot;
}
const double eps=1e-11;//之前1e-7结果精度爆炸QAQ
int gauss() {
int h=1,l=1;n-=1;
for(;h<=n&&l<=n+1;h++,l++) {
int r=h;
F(i,h+1,n) if(fabs(f[r][l])<fabs(f[i][l])) r=i;
if(fabs(f[r][l])<eps) {h--;continue;}
if(r!=h) F(i,l,n+1) swap(f[r][i],f[h][i]);
F(i,h+1,n) if(fabs(f[i][l])>eps) {
double t=f[i][l]/f[h][l];
F(j,l,n+1) f[i][j]-=f[h][j]*t;
f[i][l]=0;
}
}
F(i,h,n) if(fabs(f[i][n+1])>eps) return -1;
if(h<n+1) return n+1-h;
C(i,1,n) {
double tmp=f[i][n+1];
F(j,i+1,n) tmp-=ans[j]*f[i][j];
ans[i]=(tmp/f[i][i]);
}
n+=1;
return 0;
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
add(x,y),add(y,x);
d[x]+=1.0,d[y]+=1.0;
s[i]=x,ed[i]=y;
}
for (int i=1;i<n;i++)
{
f[i][i]=1.0;
for (int j=st[i];j;j=e[j].next)
if (e[j].to!=n)
f[i][e[j].to]=-1/d[e[j].to];
}
f[1][n]=1;
gauss();
for (int i=1;i<=m;i++)
E[i]=ans[s[i]]/d[s[i]]+ans[ed[i]]/d[ed[i]];
sort(E+1,E+m+1);
for (int i=1;i<=m;i++)
sum+=E[i]*(m-i+1.0);
printf("%.3lf",sum);
return 0;
}
[luogu3232 HNOI2013] 游走 (高斯消元 期望)的更多相关文章
- Luogu3232 HNOI2013 游走 高斯消元、期望、贪心
传送门 这种无向图上从一个点乱走到另一个点的期望题目好几道与高斯消元有关 首先一个显然的贪心:期望经过次数越多,分配到的权值就要越小. 设$du_i$表示$i$的度,$f_i$表示点$i$的期望经过次 ...
- BZOJ 3143 HNOI2013 游走 高斯消元 期望
这道题是我第一次使用高斯消元解决期望类的问题,首发A了,感觉爽爽的.... 不过笔者在做完后发现了一些问题,在原文的后面进行了说明. 中文题目,就不翻大意了,直接给原题: 一个无向连通图,顶点从1编号 ...
- bzoj 3143: [Hnoi2013]游走 高斯消元
3143: [Hnoi2013]游走 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1026 Solved: 448[Submit][Status] ...
- BZOJ3143:[HNOI2013]游走(高斯消元)
Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点, ...
- 【BZOJ-3143】游走 高斯消元 + 概率期望
3143: [Hnoi2013]游走 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2264 Solved: 987[Submit][Status] ...
- [HNOI2013][BZOJ3143] 游走 - 高斯消元
题目描述 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获得等于这条边 ...
- 【BZOJ3143】【HNOI2013】游走 高斯消元
题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3143 我们令$P_i$表示从第i号点出发的期望次数.则$P_n$显然为$0$. 对于$P ...
- 【xsy1201】 随机游走 高斯消元
题目大意:你有一个$n*m$的网格(有边界),你从$(1,1)$开始随机游走,求走到$(n,m)$的期望步数. 数据范围:$n≤10$,$m≤1000$. 我们令 $f[i][j]$表示从$(1,1) ...
- HDU2262;Where is the canteen(高斯消元+期望)
传送门 题意 给出一张图,LL从一个点等概率走到上下左右位置,询问LL从宿舍走到餐厅的步数期望 分析 该题是一道高斯消元+期望的题目 难点在于构造矩阵,我们发现以下结论 设某点走到餐厅的期望为Ek 1 ...
随机推荐
- sqldependency类轮询功能
System.Data.SqlClient.SqlDependency类为我们提供了一个关于sql2005的很好的功能 ,虽然这个东西限制有很多很多,但还是有很实用价值的. 我们先看一个演示例子: 例 ...
- String 经常用法最优算法实现总结 (一)
<pre name="code" class="java"><span style="font-family: Arial, Hel ...
- REST当道,NO MVC
前世今生 B/S开发经历了几个时代,如今已经是后MVC时期了. MVC体现了分层和解耦合的概念.从功能和理念上都做出过巨大贡献,使Java B/S开发在面对大型项目时从容不迫,说成是上个十年Java ...
- luogu2508 [HAOI2008]圆上的整点
题目大意 给出\(r\),求圆\(x^2+y^2=r^2\)上坐标均为整数的点数.\(n<=2,000,000,000\) 总体思路 我们看到这个数据大小,还是个数学题,想到这个的时间复杂度应当 ...
- win7浏览器出现无法连接到代理服务器错误解决办法
今天早上打开电脑浏览器显示无法连接到代理服务器 解决办法: 1.Google浏览器 2.打开设置->高级设置->打开代理服务器->局域网设置,把对勾去掉 3.点击确定,关闭浏览器重新 ...
- Spark MLlib介绍
Spark MLlib介绍 Spark之所以在机器学习方面具有得天独厚的优势,有以下几点原因: (1)机器学习算法一般都有很多个步骤迭代计算的过程,机器学习的计算需要在多次迭代后获得足够小的误差或者足 ...
- xenserver 增加新硬盘
xenserver 增加新硬盘 1.XS创建本地存储 首先 分区好的的硬盘接到服务器上 查看所有硬盘了的id ls -l /dev/disk/by-id/ 记下硬盘的全称.接下来开始挂载 xe sr ...
- this关键字和super关键字
一.this Java中为了解决变量的命名冲突和不确定性问题,引入了关键字this.this代表当前类的一个实例,它经常出现在方法和构造方法中,具体使用情况有以下三种: 1,返回调用当前方法的对象的引 ...
- 爬虫之 Requests库的基本使用
引入 Requests 唯一的一个非转基因的 Python HTTP 库,人类可以安全享用. 警告:非专业使用其他 HTTP 库会导致危险的副作用,包括:安全缺陷症.冗余代码症.重新发明轮子症.啃文档 ...
- 文档控件NTKO OFFICE 详细使用说明之预览Excel文件(查看、编辑、保存回服务器)
1.在线预览Excel文件 (1) 运行环境 ① 浏览器:支持IE7-IE11(平台版本还支持Chrome和Firefox) ② IE工具栏-Internet 选项:将www.ntko.com加入到浏 ...