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。


想法##

果断高斯消元解期望方程啊。

如果我们知道了每条边期望被经过的次数,那么贪心按期望值从小到大、编号从大到小编就好了

但是每条边期望被经过的次数并不好搞,每个点的期望经过次数是可以搞出来的

列方程组的时候注意,1号点最初的期望值就有1,n号点只能进不能出

假设某条边两端的点为u,v,每个点期望被经过次数为e[i],每个点的度数为d[i]

则这条边期望被经过的次数为 \(e[u]/d[u] + e[v]/d[v]\)

注意要特判一下,如果u、v中某一个为n的话,这条边只能从那个不是n的点过来,所以被经过的期望为\(e[u]/d[u]\)或\(e[v]/d[v]\)

然后排个序贪心就行啦


代码##

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath> #define eps 0.001 using namespace std; const int N = 505;
typedef double db[N][N]; int n,m;
void gauss(db A){
for(int i=1;i<=n;i++){
int r=i;
for(int j=i+1;j<=n;j++)
if(fabs(A[j][i])-fabs(A[r][i])>eps) r=j;
for(int j=i;j<=n;j++) swap(A[i][j],A[r][j]);
for(int j=i+1;j<=n;j++){
double f=A[j][i]/A[i][i];
for(int k=i;k<=n+1;k++) A[j][k]-=f*A[i][k];
}
}
for(int i=n;i>0;i--){
for(int j=i+1;j<=n;j++)
A[i][n+1]-=A[i][j]*A[j][n+1];
A[i][n+1]/=A[i][i];
}
} db a;
struct edge{
int u,v;
double f;
edge(int u=0,int v=0,double f=0.0):u(u),v(v),f(f) {}
bool operator < (const edge &b) const { return f>b.f; }
}d[N*N/2];
int s[N]; int main()
{
int x,y;
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++){
scanf("%d%d",&x,&y);
if(x>y) swap(x,y);
d[i]=edge(x,y);
if(y==n) a[y][x]=1.0;
else a[x][y]=a[y][x]=1.0;
s[x]++; s[y]++;
}
for(int i=1;i<=n;i++) {
a[i][i]=1.0;
if(i==1) a[i][n+1]=1.0;
for(int j=1;j<=n;j++){
if(j==i) continue;
if(a[i][j]) a[i][j]*=-1.0/s[j];
}
} gauss(a);
for(int i=0;i<m;i++){
if(d[i].v==n) d[i].f=a[d[i].u][n+1]*1.0/s[d[i].u];
else d[i].f=a[d[i].u][n+1]*1.0/s[d[i].u]+a[d[i].v][n+1]*1.0/s[d[i].v];
}
sort(d,d+m); double ans=0.0;
for(int i=0;i<m;i++) ans+=d[i].f*(i+1);
printf("%.3lf\n",ans); return 0;
}

[bzoj3143] [洛谷P3232] [HNOI2013] 游走的更多相关文章

  1. 洛谷P3232[HNOI2013]游走

    有一个无向简单连通图,顶点从 \(1\) 编号到 \(n\),边从 \(1\) 编号到 \(m\) 小Z在该图上进行随机游走,初始时小Z在\(1\)号顶点,每一步小Z以相等的概率随机选 择当前顶点的某 ...

  2. 洛谷 P3232 [HNOI2013]游走

    链接: P3232 题意: 和上次考试 T4 的简化且无修改一样,经典图上高斯消元求期望. 分析: 要求出每个点的期望出发次数 \(f_i\),每个点度数为 \(d_i\),有 \[f1=\sum\d ...

  3. 洛谷P3232 [HNOI2013]游走(高斯消元+期望)

    传送门 所以说我讨厌数学……期望不会高斯消元也不会……好不容易抄好了高斯消元板子被精度卡成琪露诺了…… 首先,我们先算出走每一条边的期望次数,那么为了最小化期望,就让大的期望次数乘上小编号 边的期望次 ...

  4. 题解 P3232 [HNOI2013]游走

    洛谷P3232[NOI2013]游走 题目描述 给定一个 n 个点 m 条边的无向连通图,顶点从 1 编号到 n,边从 1 编号到 m. 小 Z 在该图上进行随机游走,初始时小 Z 在 1 号顶点,每 ...

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

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

  6. P3232 [HNOI2013]游走——无向连通图&&高斯消元

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

  7. P3232 [HNOI2013]游走

    吐槽 傻了傻了,对着题解改了好长时间最后发现是自己忘了调用高斯消元了... 思路 期望题,分配编号,显然编号大的分给贡献次数小的,所以需要知道每个边被经过次数的期望 然后边被经过的次数的期望就是连接的 ...

  8. BZOJ 3143 Luogu P3232 [HNOI2013]游走 (DP、高斯消元)

    题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=3143 (luogu) https://www.luogu.org/pro ...

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

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

随机推荐

  1. Android6_大致了解4大组件

    一.Activity和View Activity是Android应用中负责与用户交互的组件. View是所有UI控件.容器控件的基类.View组件就是Android应用中用户实实在在看到的部分. Ac ...

  2. Android程序分析环境(搭建步骤略)

    1:安装JDK JDK(Java Development Kit) 是 Java 语言的软件开发工具包(SDK).没有JDK的话,无法编译Java程序. 2:安装Android  SDK Androi ...

  3. org.apache.subversion.javahl.ClientException: Item is not readable 解决办法

    在使用eclise安装的插件subclipse查看svn的提交历史记录的时候,提示org.apache.subversion.javahl.ClientException: Item is not r ...

  4. 基础之Lamada和Stream的邂逅

    show me the code and take to me,做的出来更要说的明白 GitHub项目JavaHouse同步收录 喜欢就点个赞呗! 你的支持是我分享的动力! 引入 是否有遇到看不懂身边 ...

  5. 从零开始のcocos2dx生活(五)ActionEase

    文章目录 sineEaseIn sineEaseOut sineEaseInOut expoEaseIn expoEaseOut expoEaseInOut easeIn easeOut easeIn ...

  6. 「Luogu P3931」SAC E#1 - 一道难题 Tree 解题报告

    圆原题面 我环顾四周,发现大佬们的写法都好高端! 比较差劲的我,只能交上一份DFS的题解 思路: DFS(当然了,其他算法也行) 要想切断叶子节点到根节点的连接 就是在叶子节点和根节点之间砍掉一条边 ...

  7. docker练习-容器和服务

    使用定义容器 Dockerfile Dockerfile定义容器内环境中发生的事情.对网络接口和磁盘驱动器等资源的访问在此环境中进行虚拟化,该环境与系统的其他部分隔离,因此您需要将端口映射到外部世界, ...

  8. 《图解机器学习-杉山将著》读书笔记---CH2

    CH2 学习模型 重点提炼 学习模型作用: 使特定函数与数据集相近似 学习模型类型: 1.线性模型 (1)最简单的线性模型,缺点:只能表现线性的输入输出函数,不能很好地解决实际问题 (2)基于参数的线 ...

  9. CCPC-Wannafly Winter Camp Day1 (Div2 ABCFJ) 待补...

    Day1 Div2 场外链接 按题目顺序~ A 机器人 传送门 题意:有两条平行直线A.B,每条直线上有n个点,编号为1~n.在同一直线上,从a站点到b站点耗时为两点间的距离.存在m个特殊站点,只有在 ...

  10. 3 分钟带你深入了解 Cookie、Session、Token

    经常会有用户咨询,CDN 是否会传递 Cookie 信息,是否会对源站 Session 有影响,Token 的防盗链配置为什么总是配置失败?为此,我们就针对 Cookie.Session 和 Toke ...