[Hnoi2013]游走

题目

一个无向连通图,顶点从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

OUTPUT

3.333

解题报告

这东西显然是个概率与期望(题目写的那么清楚啊喂),好吧,是一个很裸的概率与期望。
题目要求总分最小,且编号从1到m,那么显然,我们需要求一下每条边被经过的期望,期望越大,编号越小。
首先自然能删除终点的所有出边(终点是不能出来的),然后,对于每一条边,设两端端点为u,v,我们可以从u走到v,也可以从v走到u,从u走到v的期望次数等于

经过点u的次数/u的度

问题自然就转化成求每个点的期望经过次数,对于起点来说,一开始一定会经过一次,在之后也可能被经过。

f[1]=1+sigma(f[j]/degree[j],j和1有边相连)

f[i]=sigma(f[j]/degree[j],i与j有边相连)

我们得到了n变量n方程的方程组,然后高斯消元乱抡= =
稍微处理下就可以得到经过每个点的期望,那么每条边的期望即为两端点期望之和(注意:对终点一定要特殊处理啊啊啊),对每条边按期望排序,随便一乘,一加,就可以AC了。
 #include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
inline int read(){
int sum();
char ch(getchar());
for(;ch<''||ch>'';ch=getchar());
for(;ch>=''&&ch<='';sum=sum*+(ch^),ch=getchar());
return sum;
}
struct edge{
int s,e,n;
}ed[];
int pre[],tot;
inline void insert(int s,int e){
ed[++tot].s=s;
ed[tot].e=e;
ed[tot].n=pre[s];
pre[s]=tot;
}
int du[];
int n,m;
double a[][],b[],ans[];
inline double jdz(double x){
return x>=?x:-x;
}
inline void swp(double &a,double &b){
double c(a);
a=b;
b=c;
}
inline void gauss(){
int num,cnt();
for(int i=;i<n;i++,cnt++){
num=i;
for(int j=i+;j<=n;j++)
if(jdz(a[num][i])<jdz(a[j][i]))
num=j;
if(num!=i){
for(int j=;j<=n;j++)
swp(a[num][j],a[cnt][j]);
swp(b[num],b[cnt]);
}
if(!a[cnt][i]){
cnt--;
continue;
}
for(int j=cnt+;j<=n;j++){
double t(a[j][i]/a[cnt][i]);
for(int k=i;k<=n;k++)
a[j][k]-=t*a[i][k];
b[j]-=t*b[i];
}
}
for(int i=n;i>;i--){
for(int j=n;j>i;j--)
b[i]-=a[i][j]*ans[j];
ans[i]=b[i]/a[i][i];
}
}
double f[];
bool g[][];
inline int gg(){
// freopen("walk.in","r",stdin);
// freopen("walk.out","w",stdout);
n=read(),m=read();
for(int i=;i<=m;i++){
int x(read()),y(read());
insert(x,y);
g[x][y]=g[y][x]=;
du[x]++,du[y]++;
}
du[n]=;
for(int i=;i<=n;i++){
if(i==)
b[i]=;
else
b[i]=;
for(int j=;j<=n;j++){
if(i==j){
a[i][j]=;
continue;
}
if(j==n){
a[i][j]=;
continue;
}
if(g[i][j])
a[i][j]=-1.0/(double)du[j];
}
}
gauss();
for(int i=;i<n;i++)
ans[i]/=du[i];
ans[n]=;
for(int i=;i<=tot;i++){
int s(ed[i].s),e(ed[i].e);
f[i]=ans[s]+ans[e];
}
int cnt(tot);
sort(f+,f+tot+);
double an();
for(int i=;i<=tot;i++)
an+=i*f[cnt--];
printf("%.3lf",an);
return ;
}
int k(gg());
int main(){;}
ps:COGS rk1代码奉上,虽然榜貌似被两个神奇的(hhh)刷成(hhh)了,但是还是没有什么影响。。。

[补档][Hnoi2013]游走的更多相关文章

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

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

  2. [HNOI2011]XOR和路径 && [HNOI2013]游走

    [HNOI2011]XOR和路径 题目大意 具体题目:戳我 题目: 给定一个n个点,m条边的有重边.有自环的无向图,其中每个边都有一个边权. 现在随机选择一条1到n的路径,路径权值为这条路径上所有边权 ...

  3. BZOJ_3143_[Hnoi2013]游走_期望DP+高斯消元

    BZOJ_3143_[Hnoi2013]游走_期望DP+高斯消元 题意: 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机 ...

  4. P3232 [HNOI2013]游走 解题报告

    P3232 [HNOI2013]游走 题目描述 一个无向连通图,顶点从\(1\)编号到\(N\),边从\(1\)编号到\(M\). 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概 ...

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

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

  6. 【BZOJ3143】[Hnoi2013]游走 期望DP+高斯消元

    [BZOJ3143][Hnoi2013]游走 Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 ...

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

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

  8. BZOJ3141 Hnoi2013 游走 【概率DP】【高斯消元】*

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

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

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

随机推荐

  1. 表单格式化插件jquery.serializeJSON

    前言 前端在处理含有大量数据提交的表单时,除了使用Form直接提交刷新页面之外,经常碰到的需求是收集表单信息成数据对象,Ajax提交. 而在处理复杂的表单时,需要一个一个区手动判断处理字段值,显得非常 ...

  2. 两种代理模式(JDK和Cglib)实例

    CGlib代理模式: package CGLIB; import java.lang.reflect.Method; import JDK.Test; import net.sf.cglib.prox ...

  3. memcached使用文档

    使用memcached进行内存缓存 通常的网页缓存方式有动态缓存和静态缓存等几种,在ASP.NET中已经可以实现对页面局部进行缓 存,而使用memcached的缓存比ASP.NET的局部缓存更加灵活, ...

  4. 我眼中的ASP.NET Core之微服务

    ### 前言 前几天在博客园看到有园友在分享关于微软的一个微服务架构的示例程序,想必大家都已经知道了,那就是[eShopOnContainers](https://github.com/dotnet- ...

  5. htm5拖放和画布

    拖放 拖放是一种常见的特性,即抓取对象以后拖到另一个位置. 在 HTML5 中,拖放是标准的一部分,任何元素都能够拖放. 首先,为了使元素可拖动,把 draggable 属性设置为 true ondr ...

  6. Java - 在WebService中使用Client调用三方的RestAPI

    背景 近期,由于项目的要求需要在自己的webservice中调用远程的WebAPI(Restful format).自己的webservice程序是用Java编码写的,所以需要在其中实现一个Clien ...

  7. Apollo框架试玩

    2017年7月5日,百度举行了AI开发者大会,在会上发布了Apollo项目,并进行了演示,该项目在Github上已经能够被访问.出于一个程序员的好奇,昨天试玩了一把,确实不错. http://apol ...

  8. pyparsing:定制自己的解析器

    在工作中,经常需要解析不同类型的文件,常用的可能就是正则表达式了,简单点的,可能会使用awk.这里要推荐一种比较小众的方式,使用pyparsing来解析文件. pyparsing可以做些什么呢?主要可 ...

  9. localStorage与location的用法

    1.localStorage 是h5提供的客户端存储数据的新方法: 之前,这些都是由 cookie 完成的.但是 cookie 不适合大量数据的存储,因为它们由每个对服务器的请求来传递,这使得 coo ...

  10. Student implements java.io.Serializable

    package JBJADV003; public class Student implements java.io.Serializable { private String name; priva ...