【题目描述】

一个无向连通图,顶点从1编号到N,边从1编号到M。 
小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获得等于这条边的编号的分数。当小Z 到达N号顶点时游走结束,总分为所有获得的分数之和。 
现在,请你对这M条边进行编号,使得小Z获得的总分的期望值最小。

【输入格式】

第一行是正整数N和M,分别表示该图的顶点数 和边数,接下来M行每行是整数u,v(1≤u,v≤N),表示顶点u与顶点v之间存在一条边。 输入保证30%的数据满足N≤10,100%的数据满足2≤N≤500且是一个无向简单连通图。

【输出格式】

仅包含一个实数,表示最小的期望值,保留3位小数。

【样例输入】

  3  3
2 3
1 2
1 3

【样例输出】

3.333

【提示】

边(1,2)编号为1,边(1,3)编号2,边(2,3)编号为3。

【题解】

对答案贡献大的边编号越小越好,贡献小的边编号自然需要较大,这样想明显需要求出各边经过次数的期望。

首先删去终点的出边,对于每一条边,设其两个节点为u和v:可能从u走到v,也可能从v走到u,从u走到v的期望次数等于经过点u的次数/u的度数,问题转化成求每个点的期望经过次数。

和臭气弹类似地,对于起点,一开始经过一次,也可能从其他点走过来。这是n个变量n个方程的方程组,高斯消元解方程组。
                       f[1]=1+sigma(f[j]/degree(j),j和1有边)
                   f[i]=sigma(f[j]/degree(j),j和i有边,i>=2)

求出各边期望的经过次数之后从大到小sort一下,把它的编号作为边权,计算结果即可。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int sj=;
const double je=1e-;
int n,m,a1,a2,e,h[sj],q[sj*sj],z[sj*sj];
double cd[sj],a[sj][sj],c[sj],jg,xx[sj*sj];
struct B
{
int ne,v;
}b[sj*sj*];
void add(int x,int y)
{
b[e].v=y;
b[e].ne=h[x];
h[x]=e++;
cd[x]++;
}
void init()
{
scanf("%d%d",&n,&m);
memset(h,-,sizeof(h));
for(int i=;i<=m;i++)
{
scanf("%d%d",&a1,&a2);
q[i]=a1;
z[i]=a2;
if(a1!=n) add(a1,a2);
if(a2!=n) add(a2,a1);
}
for(int i=;i<n;i++)
{
a[i][i]=;
for(int j=h[i];j!=-;j=b[j].ne)
a[b[j].v][i]-=/cd[i];
}
c[]=;
a[n][n]=;
}
void jh(double &x,double &y)
{
double temp=y;
y=x;
x=temp;
}
void gs()
{
int zd;
double temp;
for(int i=;i<=n;i++)
{
zd=i;
temp=fabs(a[i][i]);
for(int j=i+;j<=n;j++)
if(temp<fabs(a[j][i]))
{
zd=j;
temp=fabs(a[j][i]);
}
if(zd!=i)
{
for(int j=;j<=n;j++)
jh(a[i][j],a[zd][j]);
jh(c[i],c[zd]);
}
if(fabs(a[i][i])<je) continue;
temp=a[i][i];
for(int j=;j<=n;j++)
a[i][j]/=temp;
c[i]/=temp;
for(int j=;j<=n;j++)
if(i!=j)
{
temp=a[j][i];
for(int k=;k<=n;k++)
a[j][k]-=a[i][k]*temp;
c[j]-=c[i]*temp;
}
}
}
int main()
{
//freopen("t.txt","r",stdin);
freopen("walk.in","r",stdin);
freopen("walk.out","w",stdout);
init();
gs();
for(int i=;i<=m;i++)
{
if(cd[q[i]])
xx[i]+=c[q[i]]/cd[q[i]];
if(cd[z[i]])
xx[i]+=c[z[i]]/cd[z[i]];
}
sort(xx+,xx+m+,greater<double>());
for(int i=;i<=m;i++)
jg+=xx[i]*i;
printf("%.3lf",jg);
//while(1);
return ;
}

游走[HNOI2013]的更多相关文章

  1. bzoj 3143: [Hnoi2013]游走 高斯消元

    3143: [Hnoi2013]游走 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1026  Solved: 448[Submit][Status] ...

  2. [补档][Hnoi2013]游走

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

  3. [HNOI2011]XOR和路径 && [HNOI2013]游走

    [HNOI2011]XOR和路径 题目大意 具体题目:戳我 题目: 给定一个n个点,m条边的有重边.有自环的无向图,其中每个边都有一个边权. 现在随机选择一条1到n的路径,路径权值为这条路径上所有边权 ...

  4. BZOJ_3143_[Hnoi2013]游走_期望DP+高斯消元

    BZOJ_3143_[Hnoi2013]游走_期望DP+高斯消元 题意: 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机 ...

  5. P3232 [HNOI2013]游走 解题报告

    P3232 [HNOI2013]游走 题目描述 一个无向连通图,顶点从\(1\)编号到\(N\),边从\(1\)编号到\(M\). 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概 ...

  6. [BZOJ3143][HNOI2013]游走(期望+高斯消元)

    3143: [Hnoi2013]游走 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3576  Solved: 1608[Submit][Status ...

  7. BZOJ3141 Hnoi2013 游走 【概率DP】【高斯消元】*

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

  8. 「HNOI2013」游走

    「HNOI2013」游走 题目描述 一个无向连通图,顶点从 \(1\) 编号到 \(N\) ,边从 \(1\) 编号到 \(M\) .小 \(Z\) 在该图上进行随机游走,初始时小 \(Z\) 在 \ ...

  9. 【BZOJ3143】[Hnoi2013]游走 期望DP+高斯消元

    [BZOJ3143][Hnoi2013]游走 Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 ...

随机推荐

  1. phpcms v9 调用自定义字段多图片的第一张或第N张图为缩略图

    1.打开相应要使用组图的模型的组图字段,添加组图 字段提示为 <div class="content_attr"> <label><input typ ...

  2. VS2017专业版和企业版激活密钥

    VS2017专业版和企业版激活密钥 Professional: KBJFW-NXHK6-W4WJM-CRMQB-G3CDH Enterprise: NJVYC-BMHX2-G77MM-4XJMR-6Q ...

  3. CoolBlog开发笔记第4课:数据库模型设计

    教程目录 1.1 CoolBlog开发笔记第1课:项目分析 1.2 CoolBlog开发笔记第2课:搭建开发环境 1.3 CoolBlog开发笔记第3课:创建Django应用 前言 我新书<Py ...

  4. php Base64编码文件二进制流主要使用

    <?php header( "Content-type: image/jpeg"); //$filename='1.jpg'; //$content=file_get_con ...

  5. a链接返回上一页

    <a href="javascript:void(0);" onclick="javascript:history.go(-1);" style='mar ...

  6. iOS 实现简单的毛玻璃效果

    最近在整理导航栏的渐隐渐现效果,整理过程中偶然学会了图片的毛玻璃效果实现,很简单,不多说了,先上图看看效果对比, 这是原图, 这是加了效果后的,创建图片的代码就不上了,下面看下添加效果的代码: // ...

  7. javascript字符串属性及常用方法总结

    length属性:str.length; 常用方法: 1.  str.charAt(n) 查找字符串中的第n个字符,如果不在0~str.length-1之间,则返回一个空字符串 2  .str.ind ...

  8. My new life

    第一次开始写博客,也是在学长的建议下想要正式的写的.有点小激动,这篇博客标志着一个新的开始,它将记录下我学习编程的生活,也象征着我将向着自己渴望的方向发展.不过这篇博客就真的是一篇随笔哈哈. 希望我的 ...

  9. Spring中对资源的读取支持

    Resource简单介绍 注:所有操作基于配置好的Spring开发环境中. 在Spring中,最为核心的部分就是applicationContext.xml文件,而此配置文件中字符串的功能发挥到了极致 ...

  10. Angular基础(二)

    双向数据 利用angular把input框里面的值和h3的值绑定在一起.在input里输入内容,内容会在h3标签里显示出来. 具体效果请看下面代码:   <!DOCTYPE html>   ...