3143: [Hnoi2013]游走

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 2264  Solved: 987
[Submit][Status][Discuss]

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位小数。

Sample Input

3 3
2 3
1 2
1 3

Sample Output

3.333

HINT

边(1,2)编号为1,边(1,3)编号2,边(2,3)编号为3。

Source

非官方数据

Solution

和 博物馆 那道题类似,列期望方程高斯消元得解。

如果对边进行处理,复杂度是$O((N^{2})^{3})$的,所以考虑利用点来求解边。

设未知数$X_{i}$表示第$i$号点的期望经过次数。那么显然有$X_{i}=\sum X_{j}$这样就可以列方程了。

显然有两个特例,必然从$1$号点出发,所以$X_{1}-1=\sum X_{j}$,以及必然从$N$号点结束,所以$X_{N}=0$,其余的可以得解。

对于一条边$<u,v>$,经过这条边的期望次数就是$\frac {X_{u}} {d[u]}+\frac {X_{v}}{d[v]}$,总期望最小,就是期望次数越小的边标号越大即可。

Code

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
inline int read()
{
int x=,f=; char ch=getchar();
while (ch<'' || ch>'') {if (ch=='-') f=-; ch=getchar();}
while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();}
return x*f;
}
#define MAXN 550
#define eps 1e-5
int N,M,mp[MAXN][MAXN],flag,d[MAXN];
double a[MAXN][MAXN],X[MAXN],p[MAXN*MAXN],ans;
inline void Debug()
{
puts("=========");
for (int i=; i<=N; i++,puts(""))
for (int j=; j<=N+; j++) printf("%.2lf ",a[i][j]);
puts("");
}
inline void Gauss()
{
flag=;
for (int i=; i<=N; i++)
{
int mx=i;
for (int j=i+; j<=N; j++)
if (abs(a[j][i])>abs(a[mx][i])) mx=j;
swap(a[i],a[mx]);
if (abs(a[i][i])<eps) {flag=-; continue;}
for (int j=i+; j<=N+; j++) if (abs(a[i][j])>) a[i][j]/=a[i][i];
a[i][i]=1.0; for (int j=i+; j<=N; j++)
{
for (int k=i+; k<=N+; k++)
a[j][k]-=a[j][i]*a[i][k];
a[j][i]=0.0;
}
// Debug();
}
for (int i=,f=; i<=N; i++,f=)
{
for (int j=; j<=N && f; j++)
if (abs(a[i][j])>eps) f=;
if (abs(a[i][M+])>eps && f) flag=;
}
if (flag==) return;
for (int i=N; i>=; i--)
{
X[i]=a[i][N+];
for (int j=i+; j<=N; j++) X[i]-=X[j]*a[i][j];
}
}
int main()
{
N=read(),M=read();
for (int i=,x,y; i<=M; i++) x=read(),y=read(),mp[x][y]=mp[y][x]=,d[x]++,d[y]++;
for (int i=; i<=N-; i++)
for (int j=; j<=N-; j++)
if (mp[i][j]) a[i][j]=-1.0/d[j];
a[][N+]=1.0;
for (int i=; i<=N; i++) a[i][i]=1.0;
// Debug();
Gauss();
for (int i=,tot=; i<=N; i++)
for (int j=i+; j<=N; j++)
if (mp[i][j]) p[++tot]=X[i]/d[i]+X[j]/d[j];
sort(p+,p+M+);
// for (int i=1; i<=M; i++) printf("%.2lf ",p[i]); puts("");
for (int i=; i<=M; i++) ans+=p[i]*(M-i+);
printf("%.3lf\n",ans);
return ;
}

【BZOJ-3143】游走 高斯消元 + 概率期望的更多相关文章

  1. Luogu3232 HNOI2013 游走 高斯消元、期望、贪心

    传送门 这种无向图上从一个点乱走到另一个点的期望题目好几道与高斯消元有关 首先一个显然的贪心:期望经过次数越多,分配到的权值就要越小. 设$du_i$表示$i$的度,$f_i$表示点$i$的期望经过次 ...

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

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

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

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

  4. 【BZOJ3143】【HNOI2013】游走 &amp;&amp; 【BZOJ3270】博物馆 【高斯消元+概率期望】

    刚学完 高斯消元,我们来做几道题吧! T1:[BZOJ3143][HNOI2013]游走 Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小 ...

  5. [HNOI2013][BZOJ3143] 游走 - 高斯消元

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

  6. 【xsy1201】 随机游走 高斯消元

    题目大意:你有一个$n*m$的网格(有边界),你从$(1,1)$开始随机游走,求走到$(n,m)$的期望步数. 数据范围:$n≤10$,$m≤1000$. 我们令 $f[i][j]$表示从$(1,1) ...

  7. 【BZOJ3143】【HNOI2013】游走 高斯消元

    题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3143 我们令$P_i$表示从第i号点出发的期望次数.则$P_n$显然为$0$. 对于$P ...

  8. 【BZOJ-3270】博物馆 高斯消元 + 概率期望

    3270: 博物馆 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 292  Solved: 158[Submit][Status][Discuss] ...

  9. BZOJ3270 博物馆(高斯消元+概率期望)

    将两个人各自所在点视为状态,新建一个图.到达某个终点的概率等于其期望次数.那么高斯消元即可. #include<iostream> #include<cstdio> #incl ...

随机推荐

  1. 【Linux学习】Linux下用户组、文件权限详解

    原文地址:http://www.cnblogs.com/123-/p/4189072.html Linux下用户组.文件权限详解 用户组 在linux中的每个用户必须属于一个组,不能独立于组外.在li ...

  2. 64位weblogic11g安装

    oracle官网上下载的weblogic就是全功能版本,下面是下载 64bit  weblogic 等待下载中…… 下载完成后运行 jar 文件(不会运行jar 的请自己百度) 运行时出现如下 原因是 ...

  3. PHP延迟静态绑定:static关键字

    PHP5.3中引入了延迟静态绑定的概念.该特性最明显的标志就是新关键字static.static类似于self,但它指的是被调用的类而不是包含类.在本例中,它的意思是调用Document::creat ...

  4. filesort是什么意思?

    我们碰到有order by 或者group by,或者distinct语句的时候,如果查看执行计划,通常会看到using filesort的字眼,那么这个filesort是不是真是文件排序呢?其实不然 ...

  5. 07-Java 中的IO操作

    1.Java IO简介: (1)I/O :in \out 即输入与输出.基本功能:读写. (2)IO流:作用:读写设备上的数据,硬盘文件.内存.键盘.网络-- 根据数据的走向,可分为:输入流.输出流. ...

  6. 5中方式实现String反转

    这里介绍Java中5中实现String反转的方式. 一.数组实现String反转 //数组实现String反转 public String reverseByArray(){ if(str == nu ...

  7. ZOJ Problem Set - 3829Known Notation(贪心)

    ZOJ Problem Set - 3829Known Notation(贪心) 题目链接 题目大意:给你一个后缀表达式(仅仅有数字和符号),可是这个后缀表达式的空格不幸丢失,如今给你一个这种后缀表达 ...

  8. django rest framework批量上传图片及导入字段

    一.项目需求 批量上传图片,然后批量导入(使用excel)每个图片对应的属性(属性共十个,即对应十个字段,其中外键三个). 二.问题 一次可能上传成百上千张图片和对应字段,原来数据库的设计我将图片和对 ...

  9. Ionic App之国际化(1)单个参数的处理

    最近的app开发中需要考虑多语言国际化的问题,经查资料,目前大部分使用的是angular-translate.js这个组件,网站说明是这个:https://angular-translate.gith ...

  10. C# 基础 new 、override实现多台区别

    一.new只是隐藏父类中的同名方法.基类和父类中都存在这个方法. namespace ConsoleApplication1 { class Program { static void Main(st ...