纪念首道期望题(虽说绿豆蛙的归宿才是,但是我打的深搜总觉得不正规)。

我们求出每条边的期望经过次数,然后排序,经过多的序号小,经过少的序号大,这样就可以保证最后的值最小。

对于每一条边的期望经过次数,其实是从它起点和终点来的。设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]游走 期望+高斯消元的更多相关文章

  1. [BZOJ3143][HNOI2013]游走(期望+高斯消元)

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

  2. 【BZOJ】3143: [Hnoi2013]游走 期望+高斯消元

    [题意]给定n个点m条边的无向连通图,每条路径的代价是其编号大小,每个点等概率往周围走,要求给所有边编号,使得从1到n的期望总分最小(求该总分).n<=500. [算法]期望+高斯消元 [题解] ...

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

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

  4. 【BZOJ 3143】【Hnoi2013】游走 期望+高斯消元

    如果纯模拟,就会死循环,而随着循环每个点的期望会逼近一个值,高斯消元就通过列方正组求出这个值. #include<cstdio> #include<cctype> #inclu ...

  5. 洛谷P3232 [HNOI2013]游走(高斯消元+期望)

    传送门 所以说我讨厌数学……期望不会高斯消元也不会……好不容易抄好了高斯消元板子被精度卡成琪露诺了…… 首先,我们先算出走每一条边的期望次数,那么为了最小化期望,就让大的期望次数乘上小编号 边的期望次 ...

  6. BZOJ3143 [Hnoi2013]游走 【高斯消元】

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

  7. bzoj3143游走——期望+高斯消元

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3143 只需算出每条边被经过的概率,将概率从小到大排序,从大到小编号,就可得到最小期望: 每条 ...

  8. bzoj 3143 [Hnoi2013]游走【高斯消元+dp】

    参考:http://blog.csdn.net/vmurder/article/details/44542575 和2337有点像 设点u的经过期望(还是概率啊我也分不清,以下都分不清)为\( x[u ...

  9. 【BZOJ3143】游走(高斯消元,数学期望)

    [BZOJ3143]游走(高斯消元,数学期望) 题面 BZOJ 题解 首先,概率不会直接算... 所以来一个逼近法算概率 这样就可以求出每一条边的概率 随着走的步数的增多,答案越接近 (我卡到\(50 ...

随机推荐

  1. cisco模拟器之------交换机、路由器、vlan的综合实例

    主要实现功能:a)位于路由器同一侧的不同网段的主机之间实现通信. b)  位于不同路由器的主机之间实现通信. 网络拓扑图: 命令配置: switch0的配置: Switch(config)#vlan ...

  2. 分享几个 git 的使用场景

    你真的会使用 git 吗?你能回答下面几个问题吗? 有三个commit(顺序:CommitA.CommitB.CommitC),它们相互独立,没有依赖. 在不修改B.C的前提下,修改A,怎么操作? 合 ...

  3. 用php+mysql+ajax实现淘宝客服或阿里旺旺聊天功能 之 后台页面

    在上一篇随笔中,我们已经看了如何实现前台的对话功能:前台我限定了店主只有一人,店铺只有一个,所有比较单一,但后台就不一样了,而后台更像是我们常见的聊天软件:当然,前台也应该实现这种效果,但原理懂了,可 ...

  4. protobuf转json

    方法介绍 protobuf的介绍在这里就不详细介绍了,主要是俺也是刚接触,感兴趣的同学可以去搜索相关博客或者直接去看源码以及google的官方文档(官方文档表示很吃力)或者去这个网站:https:// ...

  5. VMwareTools安装失败提示找不到C headers和gcc目录

    在VMware虚拟机上安装好linux系统后,发现往往不能全屏,也不能设置共享文件夹进行文件共享,这时候可以通过安装VMwareTools这个工具来实现文件拖拽.共享和全屏. 安装的过程不再赘述,关键 ...

  6. Linux常见命令语句

    查看当前目录: pwd 查看文件具体大小: ls -l 返回上一级: cd.. 返回根目录: cd / 创建一个隐藏文件 vim .test 显示隐藏文件:ls -a 编辑文件: 1.vim 文件名 ...

  7. 使用 VS2017 和 js 进行桌面程序开发 - electron 之 Hello Word

    现在基于 js 和 web浏览器核心构建的 C/S 程序越来越多,比如微信桌面版(基于 duilib 和 cef).VS CODE(基于electron)等,出于了解的目的,最近学习了 electro ...

  8. Angular4 - Can't bind to 'ngModel' since it isn't a known property of 'input'.

    用[(ngModel)]="xxx"双向绑定,如:控制台报错:Can't bind to 'ngModel' since it isn't a known property of ...

  9. DAX/PowerBI系列 - 关于时间系列 - 如何用脚本生成时间维度 (Generate Date Dimension)

    跟大家的交流是我的动力. :) DAX/PowerBI系列 - 关于时间系列 - 如何用脚本生成时间维度 (Generate Date Dimension) 难度: ★☆☆☆☆(1星) 适用范围: ★ ...

  10. ajax-post请求

    一般来说字符串读取不出来查看下面这行代码是否加上: xmlHttp.setRequestHeader('Content-type', 'application/x-www-form-urlencode ...