●BZOJ 3143 [Hnoi2013]游走
题链:
http://www.lydsy.com/JudgeOnline/problem.php?id=3143
题解:
期望dp,高斯消元
首先有这样一种贪心分配边的编号的方案:(然后我没想到,233)
我们按每一条边的期望经过次数去分配编号,
具体来说,就是期望经过次数越多的边,分配的编号越小,反之则编号越大。
然后问题转化为如何求一条边的期望经过次数。(把求边的期望转化为求点的期望)
我们定义cnt[i]表示i点的出度,dp[i]表示期望经过i点的次数。
然后对于一个边(u,v),期望经过该边的次数为dp[u]/cnt[u]+dp[v]/cnt[v].
特别的:当u或者v为N号点时,对边的期望贡献为0,因为到了N点就结束了。
所以现在需要求出dp[i].
由全期望公式$$dp[i]=\sum_{j->i}dp[j]/cnt[j]$$
特别的:
1.j!=N,因为到达N点就已经结束游戏。
2.当i==1时,dp[i]还要多加一个数值1,因为初始是就期望直接经过了1次。
显然这个DP存在环,所以高斯消元解出dp值,然后再求出每一条边的期望经过次数,贪心地去编号即可。
注:高斯消元判断系数是否为0时,要用到eps,否则可能因为精度问题而出错。
代码:
#include<bits/stdc++.h>
#define MAXN 505
using namespace std;
const double eps=1e-7;
struct EDGE{
int u,v; double exp;
bool operator < (const EDGE &rtm) const{
return exp>rtm.exp;
}
}E[MAXN*MAXN];
double a[MAXN][MAXN],dp[MAXN],ans;
double *A[MAXN];
bool Edge[MAXN][MAXN];
int cnt[MAXN];
int N,M;
int dcmp(double x){
if(fabs(x)<=eps) return 0;
return x>0?1:-1;
}
void Gausselimination(int pos,int i){
if(pos==N+1||i==N+1) return;
for(int j=pos;j<=N;j++) if(dcmp(A[j][i])!=0){
swap(A[pos],A[j]); break;
}
if(dcmp(A[pos][i])!=0){
for(int j=pos+1;j<=N;j++){
double k=A[j][i]/A[pos][i];
for(int l=i;l<=N+1;l++)
A[j][l]-=A[pos][l]*k;
}
}
Gausselimination(pos+(dcmp(A[pos][i])!=0),i+1);
if(dcmp(A[pos][i])!=0){
for(int l=i+1;l<=N;l++)
dp[i]+=A[pos][l]*dp[l];
dp[i]=A[pos][N+1]-dp[i];
dp[i]=dp[i]/A[pos][i];
}
}
void buildequation(){
for(int i=1;i<=N;i++){
a[i][i]=-1;
if(i==1) a[i][N+1]=-1;
for(int j=1;j<N;j++){
if(!Edge[j][i]) continue;
a[i][j]=1.0/cnt[j];
}
}
for(int i=1;i<=N;i++) A[i]=a[i];
}
int main(){
scanf("%d%d",&N,&M);
for(int i=1,u,v;i<=M;i++){
scanf("%d%d",&u,&v);
E[i].u=u; E[i].v=v;
Edge[u][v]=Edge[v][u]=1;
cnt[u]++; cnt[v]++;
}
buildequation();
Gausselimination(1,1);
for(int i=1,u,v;i<=M;i++){
u=E[i].u; v=E[i].v;
E[i].exp=(u!=N?dp[u]/cnt[u]:0)+(v!=N?dp[v]/cnt[v]:0);
}
sort(E+1,E+M+1);
for(int i=1;i<=M;i++)
ans+=E[i].exp*i;
printf("%.3lf\n",ans);
return 0;
}
●BZOJ 3143 [Hnoi2013]游走的更多相关文章
- bzoj 3143: [Hnoi2013]游走 高斯消元
3143: [Hnoi2013]游走 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1026 Solved: 448[Submit][Status] ...
- bzoj 3143 [Hnoi2013]游走 期望dp+高斯消元
[Hnoi2013]游走 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3394 Solved: 1493[Submit][Status][Disc ...
- BZOJ 3143 HNOI2013 游走 高斯消元 期望
这道题是我第一次使用高斯消元解决期望类的问题,首发A了,感觉爽爽的.... 不过笔者在做完后发现了一些问题,在原文的后面进行了说明. 中文题目,就不翻大意了,直接给原题: 一个无向连通图,顶点从1编号 ...
- BZOJ 3143: [Hnoi2013]游走 [概率DP 高斯消元]
一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获得等于这条边的编号的分 ...
- bzoj 3143: [Hnoi2013]游走
Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点, ...
- BZOJ 3143: [Hnoi2013]游走 概率与期望+高斯消元
Description 一个无向连通图,顶点从1编号到N,边从1编号到M.小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获 ...
- bzoj 3143 [Hnoi2013]游走(贪心,高斯消元,期望方程)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3143 [题意] 给定一个无向图,从1走到n,走过一条边得到的分数为边的标号,问一个边的 ...
- [BZOJ 3143][HNOI2013]游走(数学期望)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3143 分析: 易得如果知道了每条边经过的数学期望,那就可以贪心着按每条边的期望的大小赋 ...
- BZOJ.3143.[HNOI2013]游走(概率 期望 高斯消元)
题目链接 参考 远航之曲 把走每条边的概率乘上分配的标号就是它的期望,所以我们肯定是把大的编号分配给走的概率最低的边. 我们只要计算出经过所有点的概率,就可以得出经过一条边(\(u->v\))的 ...
随机推荐
- Linux下进程间通信--消息队列
消息队列的定义遍地都是,不想移驾,请看下文: 一.定义: 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法. 每个数据块都被认 为是有一个类型,接收者进程接收的数据块可以有不同的类型值.我 ...
- Java语言基础组成
写完才发现,这个博客不提供目录这个功能,真是想骂爹了...... 目录 关键字 标识符 注释 常量和变量 运算符 语句 函数 数组 1.关键字 描述:刚刚开始学这个的时候,真是傻傻分不清楚,不过没关系 ...
- bzoj千题计划220:bzoj3938: Robot
http://www.lydsy.com/JudgeOnline/problem.php?id=3938 以时间为x轴,以距离为y轴,那么每个机器人的行走路径就是一条折线 把折线分段加入线段树里,然后 ...
- python解释NTFS runlist的代码(文章转自北亚数据恢复张宇工程师)
代码如下: 执行效果如下:root@zhangyu-VirtualBox:~/NTFS-5# python3 read_runlist.py mft_source.img ***参数数量或格式错误! ...
- 数据结构与算法 —— 链表linked list(02)
我们继续来看链表的第二道题,来自于leetcode: 两数相加 给定两个非空链表来代表两个非负整数,位数按照逆序方式存储,它们的每个节点只存储单个数字.将这两数相加会返回一个新的链表. 你可以假设除了 ...
- java排序算法之冒泡排序(Bubble Sort)
java排序算法之冒泡排序(Bubble Sort) 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一趟:首先比较第1个和第2个数 ...
- Linux入门:增加用户,并赋予权限
一.增加用户 1.增加用户,并指定主目录 # useradd –d /usr/sam -m sam此命令创建了一个用户sam,其中-d和-m选项用来为登录名sam产生一个主目录/usr/sam(/us ...
- Python基础学习篇章四
一. Python数据类型之字典 1. 键的排序:for循环 由于字典不是序列,因此没有可靠的从左至右的顺序.这就导致当建立一个字典,将它打印出来,它的键也许会以与我们输入时的不同的顺序出现.有时候我 ...
- nodejs调试总结
之前nodejs开发中最痛苦的就是调试,因为我之前开发node时使用的编辑器还没有将nodejs的调试也集成进去,所以简单对nodejs开发的调试做了点探索,nodejs本身就有调试功能,同时node ...
- Python 自动化 第一周
1.Python简介 1.1.Python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆(中文名字:龟叔)为了在阿姆斯特丹打发时 ...