Description

一个无向连通图,顶点从1编号到N,边从1编号到M。
小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获得等于这条边的编号的分数。当小Z 到达N号顶点时游走结束,总分为所有获得的分数之和。
现在,请你对这M条边进行编号,使得小Z获得的总分的期望值最小。

Input

第一行是正整数N和M,分别表示该图的顶点数 和边数,接下来M行每行是整数u,v(1≤u,v≤N),表示顶点u与顶点v之间存在一条边。 输入保证30%的数据满足N≤10,100%的数据满足2≤N≤500且是一个无向简单连通图。

Output

仅包含一个实数,表示最小的期望值,保留3位小数。

给定一个简单无向连通图,求给每个边分配一个边权,使得从 $1$ 号点到 $n$ 号点经过边权和的期望值最小. (分配的边权互不相同,且值域为 $[1,m]$).
首先有一个结论,$1$ 到 $n$ 号点权和的期望值为 $\sum_{i=1}^{m}val[i]\times perc[i],$即每条边的边权乘以走这条边的概率.
然后,我们发现经过每条边的概率只与这条边两个端点有关,即分别走到两个端点的概率以及两个端点的度数.
具体地,我们可以列出这样的方程组:($f[i]$ 表示从起点走到 $i$ 的概率)
$f[i]=\sum f[from]\times deg[from].$
如果这是一个 $DAG,$ 则可以直接来一遍裸的 dp,然而由于有环的存在,只能用高斯消元.
即将式子变为 $f[i]-\sum f[from]\times deg[from]=0.$
可以将这个看作是关于 $i$ 的一个方程组,列出方程矩阵之后解一下即可.
特别的,由于肯定会经过 $1$ 号点,所以高斯消元中 $1$ 所对应的那个方程组的常数项为 $1.$

其实呢,你也可以把这个概率理解为期望经过该点的次数.

而你发现在这个情况下这个期望出现的次数和概率是等价的.

#include <cmath>
#include <cstdio>
#include <algorithm>
#define N 503
#define M 205089
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
double f[N][N],G[M];
int edges;
int hd[N],to[M<<1],nex[M<<1],deg[N],U[M],V[M];
void add(int u,int v)
{
nex[++edges]=hd[u],hd[u]=edges,to[edges]=v;
}
void Gauss(int n)
{
int i,j,k,now;
for(i=1;i<=n;++i)
{
now=i;
for(j=i;j<=n;++j)
{
if(fabs(f[j][i])>fabs(f[now][i])) now=j;
}
if(now!=i)
{
for(j=1;j<=n;++j) swap(f[i][j],f[now][j]);
}
if(f[i][i])
{
for(j=i+1;j<=n+1;++j) f[i][j]/=f[i][i];
f[i][i]=1;
}
for(j=i+1;j<=n;++j)
{
double div=f[j][i];
for(k=i+1;k<=n+1;++k) f[j][k]-=div*f[i][k];
f[j][i]=0;
}
}
for(i=n;i>=1;--i)
{
for(j=i+1;j<=n;++j)
{
f[i][n+1]-=f[j][n+1]*f[i][j];
}
}
}
int main()
{
int i,j,n,m;
// setIO("input");
scanf("%d%d",&n,&m);
for(i=1;i<=m;++i)
{
int u,v;
scanf("%d%d",&u,&v),add(u,v),add(v,u),++deg[u],++deg[v],U[i]=u,V[i]=v;
}
f[1][n]=1.0;
for(i=1;i<n;++i)
{
f[i][i]=1;
for(j=hd[i];j;j=nex[j])
{
int v=to[j];
if(v==n) continue;
f[i][v]=-1.0/deg[v];
}
}
Gauss(n-1);
for(i=1;i<=m;++i)
{
int a=U[i],b=V[i];
if(a!=n)
{
G[i]+=f[a][n]*(1.0/deg[a]);
}
if(b!=n)
{
G[i]+=f[b][n]*(1.0/deg[b]);
}
}
sort(G+1,G+1+m);
double ans=0;
for(i=1;i<=m;++i)
{
ans+=G[i]*((m-i+1)*1.0);
}
printf("%.3lf\n",ans);
return 0;
}

  

BZOJ 3143: [Hnoi2013]游走 概率与期望+高斯消元的更多相关文章

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

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

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

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

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

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

  4. BZOJ 3143 [Hnoi2013]游走 ——概率DP

    概率DP+高斯消元 与博物馆一题不同的是,最终的状态是有一定的概率到达的,但是由于不能从最终状态中出来,所以最后要把最终状态的概率置为0. 一条边$(x,y)$经过的概率是x点的概率$*x$到$y$的 ...

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

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

  6. P3232 [HNOI2013]游走——无向连通图&&高斯消元

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

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

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

  8. 【BZOJ】2337: [HNOI2011]XOR和路径 期望+高斯消元

    [题意]给定n个点m条边的带边权无向连通图(有重边和自环),在每个点随机向周围走一步,求1到n的期望路径异或值.n<=100,wi<=10^9. [算法]期望+高斯消元 [题解]首先异或不 ...

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

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

随机推荐

  1. Python基础『二』

    目录 语句,表达式 赋值语句 打印语句 分支语句 循环语句 函数 函数的作用 函数的三要素 函数定义 DEF语句 RETURN语句 函数调用 作用域 闭包 递归函数 匿名函数 迭代 语句,表达式 赋值 ...

  2. MFC + XToolKit的使用 ( 亲自实践 )

    1. 变量声明: 在Dlg.h    的public下 CXTPButton m_Button2; 2. 变量交换并设置按钮风格: Dlg.cpp下 void CXT_VS2010Dlg::DoDat ...

  3. Vue中的key到底有什么用?

    key是为Vue中的vnode标记的唯一id,通过这个key,我们的diff操作可以更准确.更快速 diff算法的过程中,先会进行新旧节点的首尾交叉对比,当无法匹配的时候会用新节点的key与旧节点进行 ...

  4. RPC性能优化

    优化 1:元数据共享 hessian 序列化会将两种信息写到输出流: 元数据:即类全名,字段名 值数据:即各个字段对应值(如果字段是复杂类型,则会递归传递该复杂类型 的元数据和内部字段的值数据) 在 ...

  5. scrapy命令:scrapy genspider详解 转

    当我们使用: scrapy startproject taobao 命令创建好scrapy蜘蛛后,你是否注意到,下面还有这么一行内容: F:\scrapyTest> scrapy startpr ...

  6. hdfs存储与数据同步

    两个hadoop集群之间同步数据 实例为dws的 store_wt_d表 一 文件拷贝 hadoop distcp -update -skipcrccheck hdfs://10.8.31.14:80 ...

  7. shell脚本中的EOF以及文件重定向

    <<EOF  (内容)  EOF  可以把EOF替换成其他东西(分解符)  意思是把内容当作标准输入传给程序 这里再简要回顾一下<<的用法.当Shell看到<<的时 ...

  8. 【转】sscanf函数用法实例

    sscanf() - 从一个字符串中读进与指定格式相符的数据.  函数原型:  Int sscanf( string str, string fmt, mixed var1, mixed var2 . ...

  9. busybox date 时间的加减

    1.下载安装busybox: # wget http://busybox.net/downloads/busybox-1.29.3.tar.bz2 # tar -jxvf busybox-.tar.b ...

  10. 网络初级篇之STP(实验验证)

    一.根桥的选举. 1.优先级相等时. (图1-1) (图1-2) 在上面1-1图中,已经标出桥的mac地址,桥的优先级为默认优先级(缺省:32768).任意一端口抓包,查看STP数据包内包含的信息,根 ...