[bzoj3143] [HNOI2013]游走
Description
一个无向连通图,顶点从1编号到N,边从1编号到M。
小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获得等于这条边的编号的分数。当小Z 到达N号顶点时游走结束,总分为所有获得的分数之和。
现在,请你对这M条边进行编号,使得小Z获得的总分的期望值最小。
Input
第一行是正整数N和M,分别表示该图的顶点数 和边数,接下来M行每行是整数u,v(1≤u,v≤N),表示顶点u与顶点v之间存在一条边。 输入保证30%的数据满足N≤10,100%的数据满足2≤N≤500且是一个无向简单连通图。
Output
仅包含一个实数,表示最小的期望值,保留3位小数。
Sample Input
3 3
2 3
1 2
1 3
Sample Output
3.333
Solution
问题可以转化为求每条边期望被经过多少次,然后期望大的编号小就行了。
对于每条边,它连接的两个点每次有一定概率走这条边,所以这条边的期望就是:
\[ \frac{E(u)}{deg(u)}+\frac{E(v)}{deg(v)} \]
所以问题转化为求一个点期望被经过多少次。
设\(E(x)\)表示这个点期望经过次数,可以列出式子:
\[ E(x)=\sum_{(x,v)\in Edge} \frac{E(v)}{deg(v)} \]
然后列方程解出来就行了。
对于最后一个点,走到它就结束了,所以忽略\(n\)号点连出来的边。
同样,算边的期望时也忽略。
对于第一个点,期望应为:
\[ E(1)=\sum_{(1,v)\in Edge}\frac{E(v)}{deg(v)}+1 \]
因为一开始就经过了一次。
#include<bits/stdc++.h>
using namespace std;#define ONLINE_JUDGE#ifdef ONLINE_JUDGE
#define getchar() ((p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin)),p1==p2)?EOF:*p1++)
#endifnamespace fast_IO {char buf[1<<21],*p1=buf,*p2=buf;template <typename T> inline void read(T &x) {x=0;T f=1;char ch=getchar();for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f;for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';x*=f;}template <typename T,typename... Args> inline void read(T& x,Args& ...args) {read(x),read(args...);}char buf2[1<<21],a[80];int p,p3=-1;inline void flush() {fwrite(buf2,1,p3+1,stdout),p3=-1;}template <typename T> inline void write(T x) {if(p3>(1<<20)) flush();if(x<0) buf2[++p3]='-',x=-x;do {a[++p]=x%10+48;} while(x/=10);do {buf2[++p3]=a[p];} while(--p);buf2[++p3]='\n';}template <typename T,typename... Args> inline void write(T x,Args ...args) {write(x),write(args...);}
}using fast_IO :: read;
using fast_IO :: write;
using fast_IO :: flush;#define lf double const lf eps = 1e-5;
const int maxn = 5e2+10;lf f[maxn][maxn],w[maxn*maxn];
int n,m,head[maxn],tot,deg[maxn];
struct edge{int to,nxt;}e[maxn*maxn];void add(int u,int v) {e[++tot]=(edge){v,head[u]},head[u]=tot;}
void ins(int u,int v) {add(u,v),add(v,u);}void gauss() {for(int i=1;i<=n;i++) {if(fabs(f[i][i])<eps) for(int j=i;j<=n;j++)if(fabs(f[j][i])>eps) {for(int k=1;k<=n+1;k++)swap(f[i][k],f[j][k]);break;}for(int j=i+1;j<=n;j++) {lf t=f[j][i]/f[i][i];for(int k=i;k<=n+1;k++) f[j][k]=f[j][k]-f[i][k]*t;}}for(int i=n;i;i--) {lf tmp=f[i][n+1];for(int j=i+1;j<=n;j++) tmp-=f[j][j]*f[i][j];tmp/=f[i][i];f[i][i]=tmp;}
}int main() {read(n,m);for(int i=1,x,y;i<=m;i++) read(x,y),ins(x,y),deg[x]++,deg[y]++;for(int x=1;x<=n;x++) {for(int i=head[x];i;i=e[i].nxt)if(e[i].to!=n) f[x][e[i].to]-=1.0/deg[e[i].to];f[x][x]+=1.0;}f[1][n+1]+=1.0;gauss();f[n][n]=0;for(int i=1;i<=tot;i++) w[(i+(i&1))>>1]+=f[e[i].to][e[i].to]/(lf)deg[e[i].to];sort(w+1,w+tot/2+1);lf ans=0;for(int i=1;i<=tot/2;i++) ans+=w[i]*(lf)(tot/2-i+1);printf("%.3lf\n",ans);flush();return 0;
}
转载于:https://www.cnblogs.com/hbyer/p/10196593.html
[bzoj3143] [HNOI2013]游走相关推荐
- bzoj千题计划290:bzoj3143: [Hnoi2013]游走
http://www.lydsy.com/JudgeOnline/problem.php?id=3143 计算每条边经过的概率e[] 然后经过概率多的分配的编号大,经过概率少的分配的编号小 如何计算边 ...
- bzoj3143: [Hnoi2013]游走
求经过边的期望次数,然后边的编号相当于给期望一个系数,期望大到小给编号就好 假如可以强行改边为点高斯消元的话是很方便的,然而并不资瓷 但是我们可以先把经过点的期望次数求出来:f(u)=sigema(( ...
- 线性代数五之高斯消元——[SDOI2010]外星千足虫,[HNOI2013]游走,[HNOI2011]XOR和路径,[hdu 4035]Maze
多类型高斯消元杂题 [SDOI2010]外星千足虫 description solution code [HNOI2013]游走 description solution code [HNOI2011 ...
- bzoj 3143: [Hnoi2013]游走(高斯消元)
3143: [Hnoi2013]游走 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 3171 Solved: 1390 [Submit][Stat ...
- BZOJ 3143: [Hnoi2013]游走 高斯消元 期望
3143: [Hnoi2013]游走 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 3463 Solved: 1535 [Submit][Stat ...
- [BZOJ 3143][Hnoi2013]游走(高斯消元+期望)
Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点, ...
- bzoj3143,P3232-[Hnoi2013]游走【数学期望,高斯消元,贪心】
正题 题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3143 https://www.luogu.org/problem/P3232 题 ...
- 【BZOJ3143】游走,概率计算+高斯消元
Time:2016.08.18 Author:xiaoyimi 转载注明出处谢谢 传送门 思路: 某条边的期望=该边的概率*编号 有一种贪心思路就是把边按照概率从大到小排序,然后从1-m赋值计算即可 ...
- 【BZOJ】3143: [Hnoi2013]游走 期望+高斯消元
[题意]给定n个点m条边的无向连通图,每条路径的代价是其编号大小,每个点等概率往周围走,要求给所有边编号,使得从1到n的期望总分最小(求该总分).n<=500. [算法]期望+高斯消元 [题解] ...
最新文章
- Superset配置hive数据源
- 2020 五大技术趋势:无人驾驶发展、机器视觉崛起、区块链实用化、人类增强技术、超自动化...
- 『报告』IDC:2018年物联网产业10大预测
- 四年级计算机考试反思,考试后的反思四年级作文
- 《信息存储与管理》读书笔记7 存储虚拟化
- 【Beta阶段】第四次Scrum Meeting
- Netty技术细节源码分析-ByteBuf的内存泄漏原因与检测
- 网站服务器和空间大小,网站服务器和空间大小
- Xmind8 绿色版安装教程
- 不用电脑怎么设置路由器
- linux关机会自动重启,linux——如何在linux下让系统定时自动重启(关机)
- gmm的java实现_4. EM算法-高斯混合模型GMM详细代码实现
- PTA 选择结构 7-1 能买手机吗?
- 排查Linux服务器是否被入侵步骤
- 京东裁员的背后,只会“点点点”的你,真的能度过这一次疫情带来的裁员潮吗?
- 幕课在线办公项目笔记——day2
- Removing Propagation Redundant Constraints in Redundant Modeling 翻译(一)
- 双目是个词吗_什么双目的四字词语
- 计算机专业的自荐书,计算机专业的自荐书
- 高版本Chrome兼容window.showModalDialog办法
热门文章
- mysql正则表达式配置,MySQL REGEXP:正则表达式
- 【吐血整理】java正则表达式详解
- python【数据结构与算法】动态规划详解从背包到最长公共子序列(看不懂你来打我)
- mfc e将控件置于窗口顶层_【创e分享】Word毕业论文排版全攻略
- boostrap-table export 导出监听
- 浅入 spring ioc 单例容器
- 进阶学习(3.1) Simple Factory Pattern 简单工厂模式
- 网络营销外包——改善企业网站排名现状网络营销外包少不了
- lvs在linux系统下安装,Linux下安装lvs
- java uuid会重复吗_记一次订单号重复的事故,快看看你的 uuid 在并发下还正确吗?...