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]游走相关推荐

  1. bzoj千题计划290:bzoj3143: [Hnoi2013]游走

    http://www.lydsy.com/JudgeOnline/problem.php?id=3143 计算每条边经过的概率e[] 然后经过概率多的分配的编号大,经过概率少的分配的编号小 如何计算边 ...

  2. bzoj3143: [Hnoi2013]游走

    求经过边的期望次数,然后边的编号相当于给期望一个系数,期望大到小给编号就好 假如可以强行改边为点高斯消元的话是很方便的,然而并不资瓷 但是我们可以先把经过点的期望次数求出来:f(u)=sigema(( ...

  3. 线性代数五之高斯消元——[SDOI2010]外星千足虫,[HNOI2013]游走,[HNOI2011]XOR和路径,[hdu 4035]Maze

    多类型高斯消元杂题 [SDOI2010]外星千足虫 description solution code [HNOI2013]游走 description solution code [HNOI2011 ...

  4. bzoj 3143: [Hnoi2013]游走(高斯消元)

    3143: [Hnoi2013]游走 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 3171  Solved: 1390 [Submit][Stat ...

  5. BZOJ 3143: [Hnoi2013]游走 高斯消元 期望

    3143: [Hnoi2013]游走 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 3463  Solved: 1535 [Submit][Stat ...

  6. [BZOJ 3143][Hnoi2013]游走(高斯消元+期望)

    Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点, ...

  7. bzoj3143,P3232-[Hnoi2013]游走【数学期望,高斯消元,贪心】

    正题 题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3143 https://www.luogu.org/problem/P3232 题 ...

  8. 【BZOJ3143】游走,概率计算+高斯消元

    Time:2016.08.18 Author:xiaoyimi 转载注明出处谢谢 传送门 思路: 某条边的期望=该边的概率*编号 有一种贪心思路就是把边按照概率从大到小排序,然后从1-m赋值计算即可 ...

  9. 【BZOJ】3143: [Hnoi2013]游走 期望+高斯消元

    [题意]给定n个点m条边的无向连通图,每条路径的代价是其编号大小,每个点等概率往周围走,要求给所有边编号,使得从1到n的期望总分最小(求该总分).n<=500. [算法]期望+高斯消元 [题解] ...

最新文章

  1. Superset配置hive数据源
  2. 2020 五大技术趋势:无人驾驶发展、机器视觉崛起、区块链实用化、人类增强技术、超自动化...
  3. 『报告』IDC:2018年物联网产业10大预测
  4. 四年级计算机考试反思,考试后的反思四年级作文
  5. 《信息存储与管理》读书笔记7 存储虚拟化
  6. 【Beta阶段】第四次Scrum Meeting
  7. Netty技术细节源码分析-ByteBuf的内存泄漏原因与检测
  8. 网站服务器和空间大小,网站服务器和空间大小
  9. Xmind8 绿色版安装教程
  10. 不用电脑怎么设置路由器
  11. linux关机会自动重启,linux——如何在linux下让系统定时自动重启(关机)
  12. gmm的java实现_4. EM算法-高斯混合模型GMM详细代码实现
  13. PTA 选择结构 7-1 能买手机吗?
  14. 排查Linux服务器是否被入侵步骤
  15. 京东裁员的背后,只会“点点点”的你,真的能度过这一次疫情带来的裁员潮吗?
  16. 幕课在线办公项目笔记——day2
  17. Removing Propagation Redundant Constraints in Redundant Modeling 翻译(一)
  18. 双目是个词吗_什么双目的四字词语
  19. 计算机专业的自荐书,计算机专业的自荐书
  20. 高版本Chrome兼容window.showModalDialog办法

热门文章

  1. mysql正则表达式配置,MySQL REGEXP:正则表达式
  2. 【吐血整理】java正则表达式详解
  3. python【数据结构与算法】动态规划详解从背包到最长公共子序列(看不懂你来打我)
  4. mfc e将控件置于窗口顶层_【创e分享】Word毕业论文排版全攻略
  5. boostrap-table export 导出监听
  6. 浅入 spring ioc 单例容器
  7. 进阶学习(3.1) Simple Factory Pattern 简单工厂模式
  8. 网络营销外包——改善企业网站排名现状网络营销外包少不了
  9. lvs在linux系统下安装,Linux下安装lvs
  10. java uuid会重复吗_记一次订单号重复的事故,快看看你的 uuid 在并发下还正确吗?...