题解 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以相等的概率随机选 ...
随机推荐
- 浅入浅出 MySQL 索引
简单了解索引 首先,索引(Index)是什么?如果我直接告诉你索引是数据库管理系统中的一个有序的数据结构,你可能会有点懵逼. 为了避免这种情况,我打算举几个例子来帮助你更容易的认识索引. 我们查询字典 ...
- c#私钥加密统一JAVA
public static string RSADecryptByPavKey(string pavKey,string strEncryptString) { string clearText = ...
- 服务器开发基础-Tcp/Ip网络模型—完成端口(Completion Port)模型
本文对于初学网络编程的极为友好,文中所有代码全部基于C语言实现,文中见解仅限于作者对于完成端口的初步认识,由于作者才疏学浅,出现的错误和纰漏,麻烦您一定要指出来,咱们共同进步.谢谢!!! 完成端口(c ...
- .Net·快速查找哪一个类库引用了哪一个Package
阅文时长 | 0.18分钟 字数统计 | 348.8字符 主要内容 | 1.引言&背景 2.查找法示例 3.声明与参考资料 『.Net·快速查找哪一个类库引用了哪一个Package』 编写人 ...
- 容器环境下如何将NuGet包XML文档添加到Swagger
容器环境下将NuGet包XML文档添加到Swagger 在.NET Core项目开发过程中,为了实现代码复用,我们将可以重复使用的部分拆分成一个个小的NuGet包.这些NuGet包可以在其他系统中复用 ...
- [C] gcc
概述 GNU C Compiler 流程 预处理,生成.i文件(中间文件,看不到) 编译,生成.s文件(中间文件,看不到) 汇编,生成.o文件 链接,生成可执行文件 参数 -E:预处理 -S:预处理, ...
- [刷题] 200 Number of Islands
要求 给定一个二维数组,只有0和1两个字符,1代表陆地,0代表水域,纵向和横向的陆地连接成岛屿,被水域隔开,求出地图中有多少岛屿 思路 对要查找的区域进行双重循环遍历,寻找陆地 从陆地初始点开始进行深 ...
- [OS] 概述&学习资料
计算机启动 启动自检 初始化启动 启动加载 内核装载 登录 中断 硬件中断 I/O设备 CPU Timer:时间片结束后,发中断给CPU Scheduler:将CPU合理分配任务使用 异常中断 内存: ...
- Docker —— 使用 Dockerfile 制作 Jdk + Tomcat 镜像
一.准备好Jdk和Tomcat apache-tomcat-8.5.50.tar.gz jdk-8u212-linux-x64.tar.gz 注意: Jdk 和 Tomcat 记得从官网下载,否则制作 ...
- 附: Python爬虫 数据库保存数据
原文 1.笔记 #-*- codeing = utf-8 -*- #@Time : 2020/7/15 22:49 #@Author : HUGBOY #@File : hello_sqlite3.p ...