题链:

http://www.lydsy.com/JudgeOnline/problem.php?id=3143
题解:

期望dp,高斯消元
首先有这样一种贪心分配边的编号的方案:(然后我没想到,233)
我们按每一条边的期望经过次数去分配编号,
具体来说,就是期望经过次数越多的边,分配的编号越小,反之则编号越大。

然后问题转化为如何求一条边的期望经过次数。(把求边的期望转化为求点的期望)
我们定义cnt[i]表示i点的出度,dp[i]表示期望经过i点的次数。
然后对于一个边(u,v),期望经过该边的次数为dp[u]/cnt[u]+dp[v]/cnt[v].
特别的:当u或者v为N号点时,对边的期望贡献为0,因为到了N点就结束了。
所以现在需要求出dp[i].
由全期望公式$$dp[i]=\sum_{j->i}dp[j]/cnt[j]$$
特别的:
1.j!=N,因为到达N点就已经结束游戏。
2.当i==1时,dp[i]还要多加一个数值1,因为初始是就期望直接经过了1次。
显然这个DP存在环,所以高斯消元解出dp值,然后再求出每一条边的期望经过次数,贪心地去编号即可。

注:高斯消元判断系数是否为0时,要用到eps,否则可能因为精度问题而出错。

代码:

#include<bits/stdc++.h>
#define MAXN 505
using namespace std;
const double eps=1e-7;
struct EDGE{
int u,v; double exp;
bool operator < (const EDGE &rtm) const{
return exp>rtm.exp;
}
}E[MAXN*MAXN];
double a[MAXN][MAXN],dp[MAXN],ans;
double *A[MAXN];
bool Edge[MAXN][MAXN];
int cnt[MAXN];
int N,M;
int dcmp(double x){
if(fabs(x)<=eps) return 0;
return x>0?1:-1;
}
void Gausselimination(int pos,int i){
if(pos==N+1||i==N+1) return;
for(int j=pos;j<=N;j++) if(dcmp(A[j][i])!=0){
swap(A[pos],A[j]); break;
}
if(dcmp(A[pos][i])!=0){
for(int j=pos+1;j<=N;j++){
double k=A[j][i]/A[pos][i];
for(int l=i;l<=N+1;l++)
A[j][l]-=A[pos][l]*k;
}
}
Gausselimination(pos+(dcmp(A[pos][i])!=0),i+1);
if(dcmp(A[pos][i])!=0){
for(int l=i+1;l<=N;l++)
dp[i]+=A[pos][l]*dp[l];
dp[i]=A[pos][N+1]-dp[i];
dp[i]=dp[i]/A[pos][i];
}
}
void buildequation(){
for(int i=1;i<=N;i++){
a[i][i]=-1;
if(i==1) a[i][N+1]=-1;
for(int j=1;j<N;j++){
if(!Edge[j][i]) continue;
a[i][j]=1.0/cnt[j];
}
}
for(int i=1;i<=N;i++) A[i]=a[i];
}
int main(){
scanf("%d%d",&N,&M);
for(int i=1,u,v;i<=M;i++){
scanf("%d%d",&u,&v);
E[i].u=u; E[i].v=v;
Edge[u][v]=Edge[v][u]=1;
cnt[u]++; cnt[v]++;
}
buildequation();
Gausselimination(1,1);
for(int i=1,u,v;i<=M;i++){
u=E[i].u; v=E[i].v;
E[i].exp=(u!=N?dp[u]/cnt[u]:0)+(v!=N?dp[v]/cnt[v]:0);
}
sort(E+1,E+M+1);
for(int i=1;i<=M;i++)
ans+=E[i].exp*i;
printf("%.3lf\n",ans);
return 0;
}

  

●BZOJ 3143 [Hnoi2013]游走的更多相关文章

  1. bzoj 3143: [Hnoi2013]游走 高斯消元

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

  2. bzoj 3143 [Hnoi2013]游走 期望dp+高斯消元

    [Hnoi2013]游走 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3394  Solved: 1493[Submit][Status][Disc ...

  3. BZOJ 3143 HNOI2013 游走 高斯消元 期望

    这道题是我第一次使用高斯消元解决期望类的问题,首发A了,感觉爽爽的.... 不过笔者在做完后发现了一些问题,在原文的后面进行了说明. 中文题目,就不翻大意了,直接给原题: 一个无向连通图,顶点从1编号 ...

  4. BZOJ 3143: [Hnoi2013]游走 [概率DP 高斯消元]

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

  5. bzoj 3143: [Hnoi2013]游走

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

  6. BZOJ 3143: [Hnoi2013]游走 概率与期望+高斯消元

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

  7. bzoj 3143 [Hnoi2013]游走(贪心,高斯消元,期望方程)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3143 [题意] 给定一个无向图,从1走到n,走过一条边得到的分数为边的标号,问一个边的 ...

  8. [BZOJ 3143][HNOI2013]游走(数学期望)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3143 分析: 易得如果知道了每条边经过的数学期望,那就可以贪心着按每条边的期望的大小赋 ...

  9. BZOJ.3143.[HNOI2013]游走(概率 期望 高斯消元)

    题目链接 参考 远航之曲 把走每条边的概率乘上分配的标号就是它的期望,所以我们肯定是把大的编号分配给走的概率最低的边. 我们只要计算出经过所有点的概率,就可以得出经过一条边(\(u->v\))的 ...

随机推荐

  1. C语言博客作业一二维数组

    一.PTA实验作业 题目1.7-5 数组循环左移 1.本题PTA提交列表 2.设计思路 定义变量a[100]存放整数,整数n,整数m,change作为交换数组的媒介,j,i作为循环的变量 输入整数n, ...

  2. NO.7 项目需求分析

    NO.7 项目需求分析 由于我们组的第一次选题并没有通过,所以我们又重新选择了一个题目--高校学生征信系统. 结合老师的作业要求,我们对该项目进行了详细的需求分析,软件需求规格说明书地址请点击这里.软 ...

  3. IE浏览器支持响应式网站设计

    目前响应式网站设计比较流行, 下面是摘自百度百科有关响应式设计的定义. 响应式网站设计是一种网络页面设计布局,其理念是:集中创建页面的图片排版大小,可以智能地根据用户行为以及使用的设备环境进行相对应的 ...

  4. WebApi一个控制器中定义多个Get方法。

    问题:怎样解决一个ApiController中定义多个Get方法或者Post方法? 答:要想实现一个ApiController中定义多个Get方法或者Post方法,则需要在WebApiConfig类中 ...

  5. EasyUI导航栏。

    html: <div data-options="region:'west',split:true" title="导航栏菜单" style=" ...

  6. phalcon框架命名空间

    命名空间第一影像就是实际上就相当宏定义,就是需要把一个很长的带有路径的类文件指定一个空间,然后就可直接用简单简写模式 当然如果是外部文件需要首先引入外部文件,如果不引入外部文件还是会报错.一般最会出错 ...

  7. 机器学习中的K-means算法的python实现

    <机器学习实战>kMeans算法(K均值聚类算法) 机器学习中有两类的大问题,一个是分类,一个是聚类.分类是根据一些给定的已知类别标号的样本,训练某种学习机器,使它能够对未知类别的样本进行 ...

  8. B树和B+树的插入、删除图文详解

    简介:本文主要介绍了B树和B+树的插入.删除操作.写这篇博客的目的是发现没有相关博客以举例的方式详细介绍B+树的相关操作,由于自身对某些细节也感到很迷惑,通过查阅相关资料,对B+树的操作有所顿悟,写下 ...

  9. python 字符串的方法

    capitalize() 把字符串的第一个字符改为大写 casefold() 把整个字符串的所有字符改为小写 center(width) 将字符串居中,并使用空格填充至长度 width 的新字符串 c ...

  10. redis命令详解

      redis中添加key value元素:set key value;       获取元素:get key ;   redis中添加集合:lpush key value1 value2 value ...