洛谷P3232[NOI2013]游走

题目描述

给定一个 n 个点 m 条边的无向连通图,顶点从 1 编号到 n,边从 1 编号到 m。

小 Z 在该图上进行随机游走,初始时小 Z 在 1 号顶点,每一步小 Z 以相等的概率随机选择当前顶点的某条边,沿着这条边走到下一个顶点,获得等于这条边的编号的分数。当小 Z 到达 n 号顶点时游走结束,总分为所有获得的分数之和。 现在,请你对这 m 条边进行编号,使得小 Z 获得的总分的期望值最小。

输入格式

第一行是两个整数,分别表示该图的顶点数 n 和边数 m。

接下来 m 行每行两个整数 u,v表示顶点 u 与顶点 v 之间存在一条边。

输出格式

输出一行一个实数表示答案,保留三位小数。

输入输出样例

输入

3 3
2 3
1 2
1 3

输出

3.333

说明提示

边 (1,2)编号为 1,边(1,3) 编号2,边(2,3) 编号为 3。

题解

正解的做法应该是期望dp+高斯消元QAQ

第一次接触到这样的题,我也是鼓捣了好半天

要想总体的期望值最小,就必须让经过次数越多的边的编号越小

那么这道题的主要部分就是搞每条边的期望经过次数

问题来了,边的期望并不好求,但是点的好求!!

用du[i]为点i的出度或入度,num[i]表示i点的期望经过值,f(u,v)为期望经过值

\(f(u,v)=\frac{num[u]} {du[u]}+\frac{num[v]} {du[v]}\)

求一个点的期望经过值就要用到高斯消元了

设s[i][j]为第i个方程第j项的系数

每个点经过自己的系数定为1;

\(s[i][i]=1\)

如果某个点与i相连接那么他的系数就是-1/该点的出度

\(s[i][j]=-\frac{1}{du[j]}\)

其他的系数就是0了

特殊的对于n而言,经过他就不会在出去,所以第n个方程处第n项外其余系数均为0

点1与点n一定会被经过,所以只有这两个式子的值是1,其余均为0,为了方便计算,我们把第i个式子的值存到s[i][n+1]上。

$s[i][n+1]= \sum_{j=1}^n x_j*s[i][j] $

最后在排个序就OK了

Code

#include<bits/stdc++.h>//万能头
#define ll long long
using namespace std;
const int M=125e3;
int n,m,sum,tot,head[2*M+5],ver[2*M+5],nxt[2*M+5],fro[2*M+5];
double du[505],s[505][505],num[505],ans;
priority_queue<double> q;//利用优先队列排序
void add(int u,int v)//邻接表存边
{
ver[++tot]=v;
fro[tot]=u;
nxt[tot]=head[u];
head[u]=tot;
}
void init()//初始化
{
scanf("%d%d",&n,&m);
for(int i=1,u,v;i<=m;i++)
{
scanf("%d%d",&u,&v);
add(u,v); add(v,u);
du[u]++; du[v]++;
}
}
void gauss()//高斯消元
{
for(int i=1;i<=n;i++)//正推
{
int pos=0;
for(int j=1;j<=n;j++)
if(s[i][j])
{
pos=j;
break;
}
if(s[i][pos]!=1&&s[i][pos])
for(int j=n+1;j>=pos;j--)
s[i][j]/=s[i][pos];
for(int j=i+1;j<=n;j++)
{
if(!s[j][pos])
continue;
for(int k=n+1;k>=pos;k--)
s[j][k]-=s[i][k]*s[j][pos];
}
} for(int i=n;i>=2;i--)//逆推
{
int pos=0;
for(int j=1;j<=n;j++)
if(s[i][j])
{
pos=j;
break;
}
if(s[i][pos]!=1&&s[i][pos])
for(int j=n+1;j>=pos;j--)
s[i][j]/=s[i][pos];
for(int j=1;j<i;j++)
{
if(!s[j][pos])
continue;
for(int k=n+1;k>=pos;k--)
s[j][k]-=s[i][k]*s[j][pos];
}
}
}
int main()
{
init();//初始化
for(int i=1;i<=n;i++)
for(int j=head[i];j;j=nxt[j])
{
int from=ver[j];
if(from!=n)//因为n不可能出来,所以第i个xn系数一定为0
s[i][from]=-1/du[from];
}
for(int i=1;i<=n;i++)
s[i][i]=1;
for(int i=1;i<n;i++)
s[n][i]=0;
s[n][n+1]=s[1][n+1]=1;
gauss();//高斯消元
for(int i=1;i<=n;i++)//记录xi的值
for(int j=1;j<=n;j++)
if(s[i][j]==1)
{
num[j]=s[i][n+1];
break;
}
for(int i=1;i<tot;i+=2)//计算每条边的期望经过值
{
int x=fro[i],y=ver[i];
q.push(num[x]/du[x]*(x!=n)+num[y]/du[y]*(y!=n));
}
while(!q.empty())//优先队列排序
{
sum++;
ans+=sum*q.top();
q.pop();
}
printf("%.3lf",ans);
return 0;
}

第一次用LaTeX,不熟练,望包涵orz

题解 P3232 [HNOI2013]游走的更多相关文章

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

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

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

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

  3. 洛谷P3232[HNOI2013]游走

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

  4. [bzoj3143] [洛谷P3232] [HNOI2013] 游走

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

  5. P3232 [HNOI2013]游走

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

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

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

  7. 洛谷 P3232 [HNOI2013]游走

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

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

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

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

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

随机推荐

  1. thinkphp 中区块block和模板继承extend用法举例

    1.介绍 模板继承其实并不难理解,就好比类的继承一样,模板也可以定义一个基础模板(或者是布局),并且其中定义相关的区块(block),然后继承(extend)该基础模板的子模板中就可以对基础模板中定义 ...

  2. Introduction to x265 Rate Control Algorithm

    The rate control in x265 is the same as x264's implementation, which is mostly empirical. It include ...

  3. stm32开发笔记(二):stm32系列使用V3.5固件库的帮助文件以及GPIO基本功能(一)

    前言   stm32系列是最常用的单片机之一,不同的版本对应除了引脚.外设.频率.容量等'不同之外,其开发的方法是一样的.  本章讲解使用库函数使用GPIO引脚功能.   补充   本文章为多年前学习 ...

  4. Word·去掉复制粘贴自动添加的空格

    阅文时长 | 0.05分钟 字数统计 | 145.6字符 主要内容 | 1.引言&背景 2.声明与参考资料 『Word·去掉复制粘贴自动添加的空格』 编写人 | SCscHero 编写时间 | ...

  5. 常用加密算法学习总结之数字证书与TLS/SSL

    数字证书 对于一个安全的通信,应该有以下特征: 完整性:消息在传输过程中未被篡改 身份验证:确认消息发送者的身份 不可否认:消息的发送者无法否认自己发送了信息 显然,数字签名和消息认证码是不符合要求的 ...

  6. [bug] Maven:No valid Maven installation found.maven

    原因 从别处复制来的项目,maven路径没有改过来 参考 https://blog.csdn.net/qq_40846086/article/details/81252736

  7. [Linux] 删除find到的目录

    参考 https://www.centos.bz/2017/09/linux%E7%B3%BB%E7%BB%9F%E4%B8%8Bfind%E5%91%BD%E4%BB%A4%E9%80%92%E5% ...

  8. python3 访问windows共享目录

    python3 访问windows共享目录 1.安装pysmb包 pip install pysmb 2.连接共享目录 #!/usr/bin/env python3 # -*- coding:utf- ...

  9. Jquery 常用方法及实例(Day_15)

    想要做一件事,永远都不要怕晚.只要你开始做了,就不晚. 而若是你不开始,仅仅停留在思考.犹豫甚至焦虑的状态,那就永远都是零. mouseover() / mouserout() 当鼠标进入 / 离开某 ...

  10. maven工具使用json-lib时,JSONArray.fromObject()不能执行的解决方案

    前端代码我就不展示了 ,下面说明下我遇到问题的情况,如果不想看可以直接划到黄色字体部分直接找解决方法哦~~(相关jar包我会放在云中,想要的自己下载哦,链接在视频最下面!!) 我的pom文件,如下,导 ...