题解 P3232 [HNOI2013]游走
洛谷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]游走的更多相关文章
- P3232 [HNOI2013]游走 解题报告
P3232 [HNOI2013]游走 题目描述 一个无向连通图,顶点从\(1\)编号到\(N\),边从\(1\)编号到\(M\). 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概 ...
- P3232 [HNOI2013]游走——无向连通图&&高斯消元
题意 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获得等于这条边的编 ...
- 洛谷P3232[HNOI2013]游走
有一个无向简单连通图,顶点从 \(1\) 编号到 \(n\),边从 \(1\) 编号到 \(m\) 小Z在该图上进行随机游走,初始时小Z在\(1\)号顶点,每一步小Z以相等的概率随机选 择当前顶点的某 ...
- [bzoj3143] [洛谷P3232] [HNOI2013] 游走
Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点, ...
- P3232 [HNOI2013]游走
吐槽 傻了傻了,对着题解改了好长时间最后发现是自己忘了调用高斯消元了... 思路 期望题,分配编号,显然编号大的分给贡献次数小的,所以需要知道每个边被经过次数的期望 然后边被经过的次数的期望就是连接的 ...
- BZOJ 3143 Luogu P3232 [HNOI2013]游走 (DP、高斯消元)
题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=3143 (luogu) https://www.luogu.org/pro ...
- 洛谷 P3232 [HNOI2013]游走
链接: P3232 题意: 和上次考试 T4 的简化且无修改一样,经典图上高斯消元求期望. 分析: 要求出每个点的期望出发次数 \(f_i\),每个点度数为 \(d_i\),有 \[f1=\sum\d ...
- 洛谷P3232 [HNOI2013]游走(高斯消元+期望)
传送门 所以说我讨厌数学……期望不会高斯消元也不会……好不容易抄好了高斯消元板子被精度卡成琪露诺了…… 首先,我们先算出走每一条边的期望次数,那么为了最小化期望,就让大的期望次数乘上小编号 边的期望次 ...
- 【BZOJ3143】[Hnoi2013]游走 期望DP+高斯消元
[BZOJ3143][Hnoi2013]游走 Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 ...
随机推荐
- 技能Get·解决MSSQL Where查询中文数据存在但查不出来
阅文时长 | 0.33分钟 字数统计 | 294.4字符 主要内容 | 1.引言&背景 2.声明与参考资料 『技能Get·解决MSSQL Where查询中文数据存在但查不出来』 编写人 | S ...
- 对于uos目前只能安装商店的感慨,强制安装除外
对于uos目前只能安装商店的感慨,强制安装除外 jie1018 / 2020-5-16 21:35 浏览: 702 / 回复: 26 个人觉得,在软件不足的情况下,更应该是系统支持,而不是让用 ...
- ansible常用方法
1.安装ansible yum -y install ansible 2.主机清单推荐格式 [root@controller ~]# vi /etc/ansible/hosts [controller ...
- Linux 如何查看系统负载
Linux 如何查看系统负载 310 博客 / Linux/ 4个月前/ 534 / 0 操作系统的负载状态,反映了应用程序的资源使用情况,从中能找出应用程序优化的瓶颈所在. 系统平均负载, ...
- CentOS7安装vncserver(启动失败及连接黑屏解决办法)
CentOS7安装vncserver(启动失败及连接黑屏解决办法) 转载weixin_34167043 最后发布于2017-11-09 15:11:00 阅读数 42 收藏 展开 AutoSAR入门 ...
- 利用jink的驱动软件j-flash 合并两个hex的方法,bootloader+app -(转载)
第一步:先打开第一个hex文件, 第二步:选择 "Merge data file",合并文件 第三步:两个工程有可能地址相同,会有如下提示:(如果在编译的时候设置好Flash的地址 ...
- python基础之面向对象(二)(封装、继承、多态)
一.封装 (1)封装是面向对象的一大特点 (2)面向对象编程的第一步--将属性和方法封装到一个抽象的类当中 (3)外界使用类创建对象,然后让对象调用方法 (4)对象方法的细节都被封装在类的内部 1.案 ...
- Redis I/O 多路复用技术原理
引言 Redis 是一个单线程却性能非常好的内存数据库, 主要用来作为缓存系统. Redis 采用网络 I/O 多路复用技术来保证在多个连接时,系统的高吞吐量(TPS). 系统吞吐量(TPS)指的是系 ...
- python基础之pip、.pyc、三元运算、进制、一切皆对象、可变与不可变类型
一.pip(下载工具==yum) 1.重点(必须掌握的) 列出已安装的包 pip list 安装要安装的包 pip install xxx 安装特定版本 pip install django==1.1 ...
- STM32的VDD与VDDA
http://bbs.21ic.com/icview-1651072-1-1.html VDD VSS 就是平常的电源与地.后面带A的都是模拟量的电源.