[HNOI2013]游走 期望+高斯消元
纪念首道期望题(虽说绿豆蛙的归宿才是,但是我打的深搜总觉得不正规)。
我们求出每条边的期望经过次数,然后排序,经过多的序号小,经过少的序号大,这样就可以保证最后的值最小。
对于每一条边的期望经过次数,其实是从它起点和终点来的。设f[]为每个点经过的期望,out[]为每个点的出度
设一条边,起点为u,终点为v。那么它的期望经过次数为f[u]/out[u]+f[v]/out[v]
这样问题就转化为求每个点的期望经过次数了
f[1]=1+sigma(f[j]/out(j),j和1有边)
f[i]=sigma(f[j]/out(j),j和i有边) //i>=2
这是n个变量n个方程的方程组,高斯消元解方程组,O(n^3)
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define pos(i,a,b) for(int i=(a);i<=(b);i++)
#define pos2(i,a,b) for(int i=(a);i>=(b);i--)
#define N 510
int n,m;
int read()
{
int su=0;
char ch=getchar();
while(ch<'0'||ch>'9')
ch=getchar();
while(ch<='9'&&ch>='0'){
su=su*10+ch-'0';ch=getchar();
}
return su;
}
double out[N];
double a[N][N],b[N],x[N];
int lian[N][N];
void swap(double &xx,double &yy)
{
double temp;
temp=xx;
xx=yy;
yy=temp;
}
void gauss(){
double t;
int im,num=1;
for(int k=1;k<n;k++,num++) {
im=k;
pos(i,k+1,n)
if(fabs(a[i][k])>fabs(a[im][k]))
im=i;
if(im!=k){
pos(i,k,n)
swap(a[num][i],a[im][i]);
swap(b[num],b[im]);
}
if(!a[num][k]){
num--;
continue;
}
pos(i,num+1,n){
if(!a[num][k])
continue;
t=a[i][k]/a[num][k];
pos(j,k,n+1)
a[i][j]-=t*a[k][j];
b[i]-=t*b[k];
}
}
pos2(i,n,1){
pos2(j,n,i+1)
b[i]-=a[i][j]*x[j];
x[i]=b[i]/a[i][i];
}
}
struct qian{
int from,to;
double e;
}cun[N*N];
bool aaa(const qian &a,const qian &b){
return a.e<b.e;
}
double ans;
int messi(){
freopen("walk.in","r",stdin);
freopen("walk.out","w",stdout);
n=read();m=read();
pos(i,1,m){
int x,y;
x=read();y=read();
lian[x][y]=lian[y][x]=1;
out[x]+=1.0;out[y]+=1.0;
cun[i].from=x;cun[i].to=y;
}
out[n]=0.0;
a[1][1]=-1.0;
b[1]=-1.0;
pos(i,2,n){
if(lian[i][1]==1&&out[i]){
a[1][i]=1.0/out[i];
}
}
pos(i,2,n){
a[i][i]=-1.0;
pos(j,1,n){
if(j!=i&&lian[j][i]==1&&out[j]){
a[i][j]=1.0/out[j];
}
}
}
gauss();
pos(i,1,m){
if(out[cun[i].from]!=0&&out[cun[i].to]!=0)
cun[i].e=x[cun[i].from]/out[cun[i].from]+x[cun[i].to]/out[cun[i].to];
else{
if(out[cun[i].from]==0)
cun[i].e=x[cun[i].to]/out[cun[i].to];
else
cun[i].e=x[cun[i].from]/out[cun[i].from];
}
}
sort(cun+1,cun+m+1,aaa);
pos(i,1,m){
ans+=cun[i].e*(double)(m-i+1);
}
printf("%0.3lf",ans);
return 0;
}
int hallmeow=messi();
int main(){;}
[HNOI2013]游走 期望+高斯消元的更多相关文章
- [BZOJ3143][HNOI2013]游走(期望+高斯消元)
3143: [Hnoi2013]游走 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3576 Solved: 1608[Submit][Status ...
- 【BZOJ】3143: [Hnoi2013]游走 期望+高斯消元
[题意]给定n个点m条边的无向连通图,每条路径的代价是其编号大小,每个点等概率往周围走,要求给所有边编号,使得从1到n的期望总分最小(求该总分).n<=500. [算法]期望+高斯消元 [题解] ...
- [luogu3232 HNOI2013] 游走 (高斯消元 期望)
传送门 题目描述 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获得等 ...
- 【BZOJ 3143】【Hnoi2013】游走 期望+高斯消元
如果纯模拟,就会死循环,而随着循环每个点的期望会逼近一个值,高斯消元就通过列方正组求出这个值. #include<cstdio> #include<cctype> #inclu ...
- 洛谷P3232 [HNOI2013]游走(高斯消元+期望)
传送门 所以说我讨厌数学……期望不会高斯消元也不会……好不容易抄好了高斯消元板子被精度卡成琪露诺了…… 首先,我们先算出走每一条边的期望次数,那么为了最小化期望,就让大的期望次数乘上小编号 边的期望次 ...
- BZOJ3143 [Hnoi2013]游走 【高斯消元】
题目 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获得等于这条边的编 ...
- bzoj3143游走——期望+高斯消元
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3143 只需算出每条边被经过的概率,将概率从小到大排序,从大到小编号,就可得到最小期望: 每条 ...
- bzoj 3143 [Hnoi2013]游走【高斯消元+dp】
参考:http://blog.csdn.net/vmurder/article/details/44542575 和2337有点像 设点u的经过期望(还是概率啊我也分不清,以下都分不清)为\( x[u ...
- 【BZOJ3143】游走(高斯消元,数学期望)
[BZOJ3143]游走(高斯消元,数学期望) 题面 BZOJ 题解 首先,概率不会直接算... 所以来一个逼近法算概率 这样就可以求出每一条边的概率 随着走的步数的增多,答案越接近 (我卡到\(50 ...
随机推荐
- Linux系统目录结构介绍
参考博客: http://www.cnblogs.com/chensiqiqi/p/6243549.html 感谢原博主为我学习Linux指明方向!! linux目录:一切从“根”开始,“/”是所有目 ...
- android源码、博文2
每周精选 第 54 期 精品源码 仿网易新闻app下拉标签选择菜单 仿网易新闻app下拉标签选择菜单,长按拖动排序,点击增删标签控件##示例 https://github.com/we ...
- Windows 10 上,Edge 浏览器不支持插件,因此将不运行 Java
在 Windows 10 上,Edge 浏览器不支持插件,因此将不运行 Java.微软想干嘛?
- set-集合功能介绍
叨逼叨:#集合 不可重复的列表 可变类型#1.添加 无则添加有则不操作 不可重复 # se = {'alex','eric','seven'} # se.add('qiqi') # se.add('b ...
- ASP.NET Core之跨平台的实时性能监控
前言 前面我们聊了一下一个应用程序 应该监控的8个关键位置. . 嗯..地址如下: 应用程序的8个关键性能指标以及测量方法 最后卖了个小关子,是关于如何监控ASP.NET Core的. 今天我们就来讲 ...
- [TYVJ1728/BZOJ3224]普通平衡树-替罪羊树
Problem 普通平衡树 Solution 本题是裸的二叉平衡树.有很多种方法可以实现.这里打的是替罪羊树模板. 此题极其恶心. 前驱后继模块需要利用到rank模块来换一种思路求. 很多细节的地方容 ...
- 【3D计算机图形学】变换矩阵、欧拉角、四元数
[3D计算机图形学]变换矩阵.欧拉角.四元数 旋转矩阵.欧拉角.四元数主要用于:向量的旋转.坐标系之间的转换.角位移计算.方位的平滑插值计算. 一.变换矩阵: 首先要区分旋转矩阵和变换矩阵: 旋转 ...
- linux中grep命令的用法
作为linux中最为常用的三大文本(awk,sed,grep)处理工具之一,掌握好其用法是很有必要的. 首先谈一下grep命令的常用格式为:[grep [选项] "模式" [ ...
- [luogu P1967][NOIp2013] 货车运输
题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多 ...
- informatica 学习总结
问:什么是BI? 答:BI是商务智能,它包含的应用系统和技术较宽泛,通过收集,存储,分析和提供对数据的访问,来帮助企业用户做出更好的商务决策. BI应用包括决策支持,查询和报表,联机分析处理OLAP, ...