[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. 【知识整理】这可能是RxJava 2.x 最好的入门教程(一)

    一.前言 RxJava 对大家而言肯定不陌生,其受欢迎程度不言而喻.而在去年的早些时候,官方便宣布,将在一段时间后不再对 RxJava 1.x 进行维护,而在仓库中另辟蹊径,开始对 RxJava 2. ...

  2. 石头剪刀布 R语言统计分析

    关于石头剪刀布,做出了详细的分析,具体ppt见地址 http://files.cnblogs.com/files/GMGHZ971322/R%E8%AF%AD%E8%A8%80.pptx 16级电商三 ...

  3. 在Linux与Windows上获取当前堆栈信息

    在编写稳定可靠的软件服务时经常用到输出堆栈信息,以便用户/开发者获取准确的运行信息.常用在日志输出,错误报告,异常检测. 在Linux有比较简便的函数获取堆栈信息: #include <stdi ...

  4. github用法小结

      共享仓库     bare 裸仓库   生成裸仓库时必须以.git结尾.   仓库就相当于一个服务器     ### 创建远程仓库  1. 创建以.git结尾的目录mkdir repo.git 2 ...

  5. indexOf和lastIndexOf的使用

    indexOf()和 lastIndexOf()是返回位置index的两个方法:都是接收两个参数,其中,indexOf()方法从数组的开头(位 置 0)开始向后查找:lastIndexOf()方法则从 ...

  6. centos7 minimal版本下mysql的安装

    最近第一次尝在虚拟机上安装mysql,由于是centos7 minimal版本,很多安装包或命令必须自己添加,遇到很多问题. 首先是执行# yum install mysql-server 报错: 打 ...

  7. Openfire4源码部署到eclipse中并编译

    Openfire4源码部署到eclipse中并编译 概述 Openfire是众所周知的基于xmpp协议的IM开源服务,所有操作,配置,监控,调试等以B/S方式进行展示,非常的方便管理员进行管理.它的强 ...

  8. 在当前光标处按指定属性显示字符 - BOIS中断

    在当前光标处按指定属性显示字符 - BOIS中断 最简单的调试方式是打印. 编写MBR时,判断MBR是否加载并运行,最直接的方式就是打印一个字符. INT 0x10 功能描述: 在当前光标处按指定属性 ...

  9. 初试spring-session

    一.简介 spring-session提供了用户会话信息管理的API和实现. 它将取代容器中的HttpSession.在没有容器会话集群方案的情况下,使得支持会话集群微不足道. 它支持在一个浏览器实例 ...

  10. Angular--ui-router的使用

    先引用Angular然后引用ui-router 路由清单:我们依赖的ui.router中提供了一个服务$state,此时可以用config来配置这个服务.用$stateProvider的state方法 ...