题目链接

戳我

\(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. Linux 入门知识一(附上如何解决Ubuntu的root密码问题)

    .centos有拥有七个控制台,其中第一到第六个是字符界面,第七个是图形界面 切换的快捷键是ctrl+shift+fn(n为自然数)   输入tty的话,可以检查当前处于哪个控制台   如何在cent ...

  2. linux命令详解2-文件管理,查看文件命令

    1. cat命令(tac) ----连接文件,并打印出来(顺序打印)与tac命令类似只不过,tac命令是逆序打印 [语法] cat [OPTION]... [FILE]... [选项] -A:显示所有 ...

  3. partial分部类

    意义 1.源代码控制 2.将一个类或结构分成不同的逻辑单元 3.代码拆分

  4. 108.Convert Sorted Array to Binary Search Tree(Array; Divide-and-Conquer, dfs)

    Given an array where elements are sorted in ascending order, convert it to a height balanced BST. 思路 ...

  5. 怎样取得selected的option选项的value值

    现在有一id=test的下拉框,怎么拿到选中的那个值呢?   分别使用javascript原生的方法和jquery方法   <select id="test"  name=& ...

  6. Mask_rcnn openpose realsense

    cd /home/luo/Desktop/MyFile/Mask_RCNN_Openpose_Realsense python realsense_mask_openpose_2019032601.p ...

  7. orcle clob字段查询

    select utl_raw.cast_to_varchar2(DBMS_LOB.SUBSTR(column,2000,1)) from t

  8. [C++] decltype(auto) C++ 11 feature

    1 //C++ 11 feature template <class T1, class T2> auto getMultiply(T1 data1, T2 data2) -> de ...

  9. Python爬虫实战一之爬取糗事百科段子

    大家好,前面入门已经说了那么多基础知识了,下面我们做几个实战项目来挑战一下吧.那么这次为大家带来,Python爬取糗事百科的小段子的例子. 首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把 ...

  10. mysql 事物ACID和隔离级别

    ⑴ 原子性(Atomicity) 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前面两篇博客介绍事务的功能是一样的概念,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则 ...