题目链接

戳我

\(Solution\)

首先申明几个变量:

f[x]:到点x的概率,

vis[x]:x点的度

dp[x][y]:(x,y)这条边的概率

number[x][y]:x这条边的编号

下面的式子保证存在一条(x,y)的边

我们可以知道总分的期望为:

\[\sum dp[x][y]*number[x][y]
\]

即:所有边的期望成这条边的编号的和

那么\(dp\)数组怎么算呢?

\[dp[x][y]=\frac{f[x]}{vis[x]}+\frac{f[y]}{vis[y]}
\]

所以我们现在的任务就是求出\(f\)数组

再来看看\(f\)数组怎么求?

\[p[x]=\sum\frac{p[y]}{vis[y]}
\]

发现这个式子并不能简单的递推,因为存在环.

于是我们可以列方程接未知数

运用高斯消元就好了.

但是注意:

  • 如果有点和\(n\)相连,那么在计算期望时不需要算,因为到了点\(n\)时不会继续走下去了
  • 因为开始就在点\(1\),所以第一个方程的结果要设为\(1\)

解出方程后便可以将\(dp\)数组算出来了.

现在考虑原问题: "现在,请你对这M条边进行编号,使得小Z获得的总分的期望值最小"

我们可以进行贪心

将期望大的边使他编号小

\(Code\)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int read(){
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9') f=(c=='-')?-1:1,c=getchar();
while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
return x*f;
}
struct node{
int to,next;
}e[5000010];
int vis[5000010],head[10000001],n,m,cnt,X[1000001],Y[10000001];
void add(int x,int y){
e[++cnt].to=y,e[cnt].next=head[x],head[x]=cnt;
}
double a[5001][5001],f[1000001],ans=0;
void Gauss(){
n--,a[1][n+1]=-1;
for(int i=1; i<=n; i++) {
int bj=i;
for(int j=i+1; j<=n; j++)
if(fabs(a[j][i])>fabs(a[bj][i]))
bj=j;
for(int j=1; j<=n+1; j++)
swap(a[bj][j],a[i][j]);
if(!a[i][i])
continue;
double p=a[i][i];
for(int j=1;j<=n+1;j++)
a[i][j]/=p;
for(int j=1;j<=n;j++)
if(i!=j){
double o=a[j][i];
for(int k=1;k<=n+1;k++)
a[j][k]-=a[i][k]*o;
}
}
for(int i=n-1; i>=1; i--)
for(int j=i+1; j<=n; j++)
a[i][n+1]-=a[j][n+1]*a[i][j];
}
int main() {
n=read(),m=read();
for(int i=1;i<=m;i++)
X[i]=read(),Y[i]=read(),add(Y[i],X[i]),add(X[i],Y[i]),vis[X[i]]++,vis[Y[i]]++;
for(int i=1;i<n;i++){
a[i][i]=-1;
for(int j=head[i];j;j=e[j].next){
int v=e[j].to;
if(v!=n)
a[i][v]=1.0/vis[v];
}
}
Gauss();
for(int i=1; i<=m; i++){
if(X[i]!=n+1)
f[i]+=a[X[i]][n+1]/vis[X[i]];
if(Y[i]!=n+1)
f[i]+=a[Y[i]][n+1]/vis[Y[i]];
}
sort(f+1,f+1+m);
for(int i=1;i<=m;i++)
ans+=f[i]*(m-i+1);
printf("%0.3lf",ans);
return 0;
}

「HNOI 2013」游走的更多相关文章

  1. 「专题训练」游走(BZOJ-3143)

    题意与分析 定义走到每条边的期望为\(e_i\),一开始的想法是给定一个\(\large\sum_{i=1}^n e_i a_i\),求一个a的排列使得这个和最小.问题在于这样等于没对题目作分析,而且 ...

  2. 「HNOI 2013」比赛

    题目链接 戳我 \(Solution\) 这道题观察数据范围发现很小,再看看题目可以发现是搜索. 这题纯搜索会\(T\)所以要加入适当剪枝 如果一个人后面的比赛都赢却依旧到不了目标分数,则直接\(re ...

  3. 「HNOI 2013」消毒

    题目链接 戳我 \(Solution\) 我们首先想一想如果这一题只是二维的该怎么办? 就是一个最小点覆盖问题.这里就不详细解释了,用网络流或匈牙利都无所谓. 但现在是三维的,那么现在该如何处理呢? ...

  4. 「HNOI 2013」数列

    题目链接 戳我 \(Solution\) 这道题貌似并不难的样子\(QAQ\) 我们发现这个因为有首项的关系所以有点不太好弄.所以我们要将这个首项对答案的影响给去掉. 我们可以构建一个差分数组,我们令 ...

  5. 「HNOI2013」游走

    「HNOI2013」游走 题目描述 一个无向连通图,顶点从 \(1\) 编号到 \(N\) ,边从 \(1\) 编号到 \(M\) .小 \(Z\) 在该图上进行随机游走,初始时小 \(Z\) 在 \ ...

  6. LOJ#3054. 「HNOI 2019」鱼

    LOJ#3054. 「HNOI 2019」鱼 https://loj.ac/problem/3054 题意 平面上有n个点,问能组成几个六个点的鱼.(n<=1000) 分析 鱼题,劲啊. 容易想 ...

  7. 「HNOI/AHOI2018」道路

    传送门 Luogu 解题思路 考虑树形 \(\text{DP}\) 设状态 \(dp[u][i][j]\) 表示从首都走到点 \(u\) ,经过 \(i\) 条公路,\(j\) 条铁路的最小不方便值. ...

  8. Solution -「HNOI 2007」「洛谷 P3185」分裂游戏

    \(\mathcal{Description}\)   Link.   给定 \(n\) 堆石子,数量为 \(\{a_n\}\),双人博弈,每轮操作选定 \(i<j\le k\),使 \(a_i ...

  9. 「HNOI 2019」白兔之舞

    一道清真的数论题 LOJ #3058 Luogu P5293 题解 考虑$ n=1$的时候怎么做 设$ s$为转移的方案数 设答案多项式为$\sum\limits_{i=0}^L (sx)^i\bin ...

随机推荐

  1. 表单验证常用的JS正则表达式

    在表单验证中,使用正则表达式来验证正确与否是一个很频繁的操作,本文收集整理了15个常用的javaScript正则表达式,其中包括用户名.密码强度.整数.数字.电子邮件地址(Email).手机号码.身份 ...

  2. pip / conda 导出和安装环境组件 requirements.txt

    pip 批量导出包含环境中所有组件的requirements.txt文件 pip freeze > requirements.txt pip 批量安装requirements.txt文件中包含的 ...

  3. WCF配置Tcp协议

    注意点: 1,<serviceMetadata httpGetEnabled="false"/>   2,       <services>         ...

  4. IDEA快捷键【收藏】

    Ctrl+Alt+L 格式化代码Ctrl+Shift+J 两行合成一行,删去不必要的空格匹配代码格式其他快捷键:[常规]Ctrl+Shift + Enter,语句完成“!”,否定完成,输入表达式时按 ...

  5. css实现文本过长时自动添加省略号

    1. 效果 2. Html <div id="main_app_content" class="container"> <div class= ...

  6. 一款比较好用的JS时间控件-laydate

      官方讲解:http://laydate.layui.com/ 具体的内容请看官方讲解,此处仅说名应用: 1.在jsp或html或其他中引入laydate.js <script src=&qu ...

  7. CentOS Mysql安装配置

    一.mysql简介 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司.MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数 ...

  8. Ubuntu16.0安装Eclipse Neon

    eclipse在Ubuntu下安装先安装jdk,配置环境变量,之后下载eclipse安装包,解压,放置在目标目录,将jre链接到该目录或者将jdk下的jre目录复制到eclipse安装包目录下,双击文 ...

  9. 添加字段modify

    ALTER TABLE tc_activity_turntable ADD `foot_pic` VARCHAR () NOT NULL DEFAULT '' COMMENT '底部图片';

  10. Mosquitto 单向SSL配置

    Mosquitto 单向SSL配置 摘自:https://blog.csdn.net/a_bcd_123/article/details/70167833 2017年04月14日 06:56:06 s ...