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\) ,你要在这棵树中选择 \( ...
随机推荐
- nodejs廖雪峰大神教程
https://www.liaoxuefeng.com/wiki/1022910821149312/1023025235359040
- Elven Postman
Elven Postman Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...
- Unregistering JMX-exposed beans on shutdown解决方法:
Unregistering JMX-exposed beans on shutdown解决方法: 加入依赖如下: <dependency> <groupId>org.spr ...
- flask之二
flask之二 预热 在渲染模板的时候,默认会从项目根路径下的templates目录下查找模板 如果想要指定模板路径的时候,就在初始化APP的时候,这样操作即可: app = Flask(__name ...
- 通过VLC的ActiveX进行二次开发,实现一个多媒体播放器 2011-04-10 00:57:23
http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=25498312&id=218294 通过VLC的ActiveX进行二 ...
- 学习:多项式算法----FFT
FFT,即快速傅里叶变换,是离散傅里叶变换的快速方法,可以在很低复杂度内解决多项式乘积的问题(两个序列的卷积) 卷积 卷积通俗来说就一个公式(本人觉得卷积不重要) $$C_k=\sum_{i+j=k} ...
- 有用的官方API和官网
1.Bootstrap API:http://www.runoob.com/bootstrap/bootstrap-tutorial.html 2.百度地图API示例:http://lbsyun.ba ...
- mysql 数据库表结构对比语句
判断两个数据库互相不存在的表 select a.TABLE_SCHEMA,a.TABLE_NAME from information_schema.TABLES a where a.TABLE_SCH ...
- Dockerfile设置时区alpine
背景: 最近在写golang相关代码.其中用到了时间操作的相关函数,如下: nowTime := time.Now() nUnixEndTime := nowTime.Unix() nHour, nM ...
- Python 学习笔记16 类 - 导入
我们在编码的过程中,可能会给对象添加越来越多的功能,即使我们使用了继承,也不可避免的使文件越来越臃肿. 为了避免这种情况, Python允许将对象存储在模块中,并且可以在其他模块中进行导入. 其实这和 ...