BZOJ-3143/洛谷3232 游走(HNOI2013)概率DP
题意:给定n个点m条边。每条边的权值还没决定,权值大小为从1到m。从1出发每次等概率选一条出边向下走,直到走到n点停止,路径代价就是边权总和。由你来决定边权来使得上诉路径代价期望值最小。
解法:点这么少边这么多,比较容易想到我们先求出点的期望经过次数dp[i],那么对于一条边(u,v)它的期望经过次数就等于 (dp[u]/du[u]+dp[v]/du[v])。对于这个值排序之后贪心赋予边权大小即可。
问题在于怎么得到每个点的期望经过次数呢?
这里直接写状态转移方程 dp[u]=sigma(dp[v]/du[v]) + [u==1];(v表示出点,du表示度数)
特别要注意几个点:
①为什么是du[v]而不是du[u]?因为此时算的是从1出发的 。②为什么u==1时候才加一,其实这个问题结果和上一个一样。 ③注意终点n不参与上诉的转移,为什么? 因为一旦到达终点n之后就不再游走了。
代码如下:
#include<bits/stdc++.h>
using namespace std;
const int N=+;
const double eps=1e-;
int n,m,k;
vector<int> G[N];
struct edge{
int x,y; double gx=;
bool operator < (const edge &rhs) const {
return gx>rhs.gx;
}
}e[N*N]; double c[N][N],b[N];
void Gauss() {
int r=;
for (int i=;i<=n;i++) {
int j=r+;
while (j<=m && fabs(c[j][i])<eps) j++; //从下面方程找一个第i位不为0的
if (j==m+) continue; //不存在第i位不为0的方程
r++; //矩阵的秩
for (int k=;k<=n;k++) swap(c[r][k],c[j][k]); //存在第i位不为0的方程,交换上去
swap(b[r],b[j]); for (int j=;j<=m;j++) { //以r方程回代m个方程
if (r==j) continue;
double rate=c[j][i]/c[r][i];
for (int k=i;k<=n;k++) c[j][k]-=c[r][k]*rate;
b[j]-=b[r]*rate;
}
} // for (int i=1;i<=m;i++) if (b[i]) { //判断无解情况
// bool ok=0;
// for (int j=1;j<=n;j++) if (c[i][j]) { ok=1; break; }
// if (!ok) { puts("Inconsistent data."); return; }
// } //if (r<n) { puts("Multiple solutions."); return; } //有解但多解 for (int i=;i<=n;i++) b[i]=b[i]/c[i][i]; //唯一解求解
} int main()
{
cin>>n>>k; m=n;
for (int i=;i<=k;i++) {
int x,y; scanf("%d%d",&x,&y);
G[x].push_back(y);
G[y].push_back(x);
e[i].x=x; e[i].y=y; e[i].gx=;
}
memset(c,,sizeof(c));
memset(b,,sizeof(b));
for (int i=;i<=n;i++) {
c[i][i]+=1.0;
if (i==n) break;
for (int j=;j<G[i].size();j++) {
int v=G[i][j];
if (v==n) continue;
c[i][v]-=1.0/G[v].size();
}
if (i==) b[i]+=1.0;
}
Gauss();
for (int i=;i<=k;i++) {
e[i].gx+=b[e[i].x]/G[e[i].x].size();
e[i].gx+=b[e[i].y]/G[e[i].y].size();
}
sort(e+,e+k+);
double ans=;
for (int i=;i<=k;i++) ans+=e[i].gx*i;
printf("%.3lf\n",ans);
return ;
}
BZOJ-3143/洛谷3232 游走(HNOI2013)概率DP的更多相关文章
- BZOJ3141 Hnoi2013 游走 【概率DP】【高斯消元】*
BZOJ3141 Hnoi2013 Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点 ...
- l洛谷 P6030 [SDOI2012]走迷宫 概率与期望+高斯消元
题目描述 传送门 分析 首先判掉 \(INF\) 的情况 第一种情况就是不能从 \(s\) 走到 \(t\) 第二种情况就是从 \(s\) 出发走到了出度为 \(0\) 的点,这样就再也走不到 \(t ...
- 洛谷P1850 换教室(概率dp)
传送门 我的floyd竟然写错了?今年NOIP怕不是要爆零了? 这就是一个概率dp 我们用$dp[i][j][k]$表示在第$i$个时间段,已经申请了$j$次,$k$表示本次换或不换,然后直接暴力转移 ...
- 洛谷P2719 搞笑世界杯 题解 概率DP入门
作者:zifeiy 标签:概率DP 题目链接:https://www.luogu.org/problem/P2719 我们设 f[n][m] 用于表示还剩下n张A类票m张B类票时最后两张票相同的概率, ...
- BZOJ_3143_[Hnoi2013]游走_期望DP+高斯消元
BZOJ_3143_[Hnoi2013]游走_期望DP+高斯消元 题意: 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机 ...
- [BZOJ 3039&洛谷P4147]玉蟾宫 题解(单调栈)
[BZOJ 3039&洛谷P4147]玉蟾宫 Description 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. ...
- 洛谷 P4072 [SDOI2016]征途 斜率优化DP
洛谷 P4072 [SDOI2016]征途 斜率优化DP 题目描述 \(Pine\) 开始了从 \(S\) 地到 \(T\) 地的征途. 从\(S\)地到\(T\)地的路可以划分成 \(n\) 段,相 ...
- 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)
洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...
- 洛谷 P3177 [HAOI2015]树上染色 树形DP
洛谷 P3177 [HAOI2015]树上染色 树形DP 题目描述 有一棵点数为 \(n\) 的树,树边有边权.给你一个在 \(0 \sim n\)之内的正整数 \(k\) ,你要在这棵树中选择 \( ...
随机推荐
- UVa 10054 : The Necklace 【欧拉回路】
题目链接 题目大意:我的妹妹有一串由各种颜色组成的项链. 项链中两个连续珠子的接头处共享同一个颜色. 如上图, 第一个珠子是green+red, 那么接这个珠子的必须以red开头,如图的red+whi ...
- 对Asycn/Await的研究
1.async 函数就是 Generator 函数的语法糖. 例如: var fs = require('fs'); var readFile = function (fileName){ retur ...
- tensorflow图像处理函数(1)
1.tensorflow中对jpeg格式图像的编码/解码函数: import matplotlib.pyplot as plt import tensorflow as tf image_raw_da ...
- Centos抓包方法
1. 安装tcpdump工具 rpm -ql tcpdump #查看tcpdump是否安装 本机是安装的,yum安装: yum install tcpdump 2. tcpdump抓包 根据协议和端 ...
- OPTIONS请求后台处理 跨域Filter
import cn.hutool.http.Method; import org.springframework.web.filter.OncePerRequestFilter; import jav ...
- C# 修改注册表立即刷新 转载
修改注册表后不重启计算机并生效,代码如下:const int WM_SETTINGCHANGE = 0x001A; const int HWND_BROADCAST = 0xffff;IntPtr r ...
- 20180704-Java开发环境配置
介绍如何搭建Java开发环境推荐:在Cloud Studio中运行Java程序 Java是一种跨平台的编程语言,想要让你的计算机能够运行Java程序那么就需要安装JRE,而想要开发Java程序,那么就 ...
- 整数解 (hdu 2092
整数解 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- BUUCTF |[0CTF 2016]piapiapia
步骤: nickname[]=wherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewhere ...
- NOIp 基础数论知识点总结
推荐阅读 NOIp 数学知识点总结: https://www.cnblogs.com/greyqz/p/maths.html Basic 常用素数表:https://www.cnblogs.com/g ...